C# Debug
语法、IDE环境使用、Debug方法是学习一门语言的最少必须技能,本文总结C#中的最常用调试方法
一、 断点
如下图所示在欲插入断点的地方右键》断点》插入断点(或在行号左边点击)可在选中语句上插入断点:

Debug模式下程序运行到断点所在语句时会阻塞在该语句上,如下图所示
此时可以通过工具栏上“逐语句”、“逐过程”、“跳出”即
来进行调试,调试期间光标放在变量上可以显示变量的当前值。
二、 跟踪点
在图1中,不仅可以插入断点,也可插入跟踪点,跟踪点是一种特殊的断点,可以配置为满足一定条件后才命中该断点,并可以将重要信息输出到Output窗口,类似于Debug.WriteLine(),它实际上是输出调试信息且不修改代码的一种方式。
根据配置不同跟踪点有如下三种形状,从上到下依次为
- 输出信息并阻塞
- 输出信息不阻塞
- 条件性阻塞并输出信息

三、 Debug与Trace类记录调试信息
//System.Diagnostics.Debug类与System.Diagnostics.Trace可用于记录并输出调试信息
System.Diagnostics.Debug.Write("info");
System.Diagnostics.Debug.WriteIf(true, "info");
System.Diagnostics.Debug.WriteLine("info");
System.Diagnostics.Debug.WriteLineIf(true, "info");
//将info记录到监听器和VS的Output窗口
System.Diagnostics.Debug.Assert(true, "info");
System.Diagnostics.Debug类与System.Diagnostics.Trace与Log4Net相对比,使用非常简单,并且高度可视化实时监测。如果使用Log4Net等日志框架,需要进行各种繁杂的配置,不花上几天时间难以掌握这套框架。虽然Log4Net等日志框架功能强大,但是目前为止我需要的功能System.Diagnostics.Debug类与System.Diagnostics.Trace完全能满足。
3.1 配置监听器(Listeners)
Debug与Trace的监听器(Listeners)是可以自定义的,以下是MSDN原文描述:
The listeners produce formatted output from the debug output. By default, the collection contains an instance of the DefaultTraceListener class. To remove the default listener, call the Remove method, and pass it the instance of the DefaultTraceListener. To redirect output to the console window, add an instance of the ConsoleTraceListener. To redirect output to a file or stream, add an instance of the TextWriterTraceListener. The Listeners collection is shared by both the Debug and the Trace classes; adding a trace listener to either class adds the listener to both.
具体添加一个Listener方法如下:
/// <summary>
/// 添加控制台监听器
/// 添加该监听器后程序运行期间将会跳出控制台窗口显示调试信息
/// </summary>
public static void AddConsoleTraceListener(bool useErrorStream)
{
ConsoleTraceListener t = new ConsoleTraceListener(useErrorStream);
System.Diagnostics.Debug.Listeners.Add(t);
System.Diagnostics.Debug.AutoFlush = true;
} /// <summary>
/// 添加日志文件监听器
///添加该监听器后程序运行时会将调试信息写入exe所在目录的.log文件中
/// </summary>
public static void AddTextWriterTraceListener()
{
TextWriterTraceListener t = new TextWriterTraceListener(FileName);
System.Diagnostics.Debug.Listeners.Add(t);
System.Diagnostics.Debug.AutoFlush = true;
}
实际上也可以通过配置文件添加与配置
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="myListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="TextWriterOutput.log" />
<remove name="Default" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
3.2 利用DebugView监听调试信息
在生成exe后,直接双击exe运行,则Debug与Trace输出的调试信息可以直接在DebugView中看到。在DebugView可以通过filter查看自己感兴趣的调试信息(你可能会看到很多程序都在向这里写入调试信息)。
该软件捕获的是exe直接运行时,抛出的信息,而不是Visual Studio调试时的,因此只适合在你的软件已经部署以后用来查看软件运行中抛出的调试信息,相当于VS Output窗口替代品。
关于DebugView详细介绍可以参考
DebugView调试入门篇
http://blog.csdn.net/jiankunking/article/details/44984487
https://www.cnblogs.com/hbccdf/p/csharp_debug_induction.html
DebugView下载地址
https://docs.microsoft.com/zh-cn/sysinternals/downloads/debugview
3.3 System.Diagnostics.Debug类与System.Diagnostics.Trace类的区别
3.3.1 条件编译符
开发产品的时候,为了追踪代码运行状态我们会加入一些用于输出调试信息的代码,如System.Diagnostics.Debug.WriteLine("info")、Console.WriteLine等。但是产品发布的时候,我们不需要这些调试信息和调试代码,这就需要通过条件编译符来实现。即在debug模式和release模式下选择性编译某些代码。条件编译符另外一个最常见到的地方是跨平台程序的代码中,即根据平台不同条件性的编译不同的代码。
C#中通过
· 给方法加上ConditionalAttribute特性来控制代码的编译
· 使用#if..#else..#endif,来控制代码的编译
来实现条件编译
3.3.2 Debug类与Trace类区别
Debug类与Trace类的差别就在于条件编译符不同,Debug类必须在定义了名为“DEBUG”的宏的条件下才会被编译,而Trace必须在定义了名为“TRACE”的宏的条件下才会被编译,而默认条件下VS在debug模式下会定义“DEBUG”与“TRACE”宏,在release模式下只定义“TRACE”宏。因此就可以理解Debug类只能在Debug模式下执行,在Release模式下无效果,而Trace类在Debug和Release模式下都可以执行。Debug类只能在Debug模式下执行,在Release模式下无效果,而Trace类在Debug和Release模式下都可以执行。
C# Debug的更多相关文章
- jmeter sampler maven项目排错记
eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...
- 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL
在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- 设置tomcat远程debug
查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...
- Android NDK debug 方法
最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...
- struts debug 标签
< s:debug> 引起下面的错误 org.apache.jasper.JasperException: Caught an exception while getting the pr ...
- How to debug .NET Core RC2 app with Visual Studio Code on Windows?
Simone Chiaretta (http://codeclimber.net.nz/archive/2016/05/20/How-to-debug-NET-Core-RC2-app-with-Vi ...
- Debug Databinding Issues in WPF
DataBinding is one of the most powerful features in WPF. But because it resolves the bindings at run ...
- Debug JDK变量显形
本文面向的朋友 本文主要说明在使用Eclipse Debug JDK时,看不到变量值的解决办法. 如果您看到上面绿色字体表示不敢兴趣,请一定果断back,如果您不爽,请在下面使劲的拍. Debug J ...
随机推荐
- Digital variable resistor compensates voltage regulator
A variable resistor that integrates a programmable, temperature-indexed look-up table can compensate ...
- LWIP轻量级TCPIP协议栈的移植
http://blog.csdn.net/ygrx/article/details/8020516 好久没有做过技术工作了,前几天因为一些需要,要在ST的OS20平台上进行了LWIP的移植,有一些心得 ...
- CMSIS-SVD Schema File Ver. 1.1 (draft)
http://www.keil.com/pack/doc/cmsis/svd/html/group__schema__1__1__gr.html <?xml version="1.0& ...
- 添加引用方式抛出和捕获干净的WebService异常
转载:http://www.cnblogs.com/ahdung/p/3953431.html 说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message ...
- 容器+AOP实现动态部署(四)
上篇咱们介绍了容器和AOP的结合,结合后怎样将对象增强服务并没有过多的说明,这里将详细说明怎样将对象 进行增强 ,达到一个一对多和多对多的增强方式 先从简单的方式说起 /** *JDK代理类,实现动态 ...
- webbrowser 常用方法(C#)
0.常用方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(st ...
- Junit Hamcrest Mockito单元测试
pom.xml配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- 操作系统概念学习笔记三 cpu调度算法
一 基本概念 1 队列中的记录通常是进程的进程控制块. 2 CPU调度决策可在如下四种环境下发生 a 当一个进程从运行状态切换到等待状态 例如,I/O请求或调用wait以等待一个子进程的终止 b 党一 ...
- 2014Esri全球用户大会——亮点系列之产品技术
2014年Esri全球用户大会已于7月14日~18日隆重召开,让我们一起来回味下面精彩内容: 序:大会主题"Creating Our Future" [解读]: 传达两个核 ...
- (转)Akka学习笔记(二):Actor Systems
Akka学习笔记(二):Actor Systems 图中表示的是一个Actor System,它显示了在这个Actor System中最重要实体之间的关系. 什么是actor,是一个封装了状态和行为的 ...