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 ...
随机推荐
- Use a microcontroller to design a boost converter
Boost converters, like other switchers, have traditionally received their control signals from a ded ...
- Eclipse寻找JVM(JRE)的顺序机制
http://developer.51cto.com/art/200907/135271.htm Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.本文将简单谈谈Eclips ...
- matlab mex中C++内存全局共享和持久化
为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库: 然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该 ...
- openfire Hazelcast插件集群配置
原文:http://blog.csdn.net/frankcheng5143/article/details/48708899 注意虽然hazelcast 官方已经有了3.5.2版本,但是openfi ...
- Android 下文件cannot execute - Permission denied
安卓下执行交叉编译的可执行文件发现提示不允许. 原因是mount的方式问题,root后运行 su mount -o rw,remount /mnt/sdcard 就可以了 mount -o rw,re ...
- Java编程兵书
<Java编程兵书> 基本信息 作者: 桂颖 任昱衡 丛书名: 程序员藏经阁 出版社:电子工业出版社 ISBN:9787121207419 上架时间:2013-8-26 出版日期:2013 ...
- [Linux] ubuntu server sudo出现sudo:must be setuid root 完美解决办法
1.开机按shift或esc先进行recovery模式 2.选择root命令行模式 3.先执行 #mount -o remount,rw / 这个很重要,网上找的很多资料都不全没有这步造成无法恢复成功 ...
- iOS:CoreData数据库的使用一(创建单个数据库表)
CoreData数据库框架:mac系统自带的数据库,它是苹果公司对sqlite进行封装而来的,既提供了对数据库的主要操作,也提供了具体的视图关系模型. 需要用到三个对象: 1•Managed Obje ...
- 【转】Ubuntu 18.04安装小记
我的电脑是神舟z7 kp7s1,显卡1060,尝试了Ubuntu的16.04,安装完进入界面总是卡死了,后面换18.04依然无解,和版本无关,而是因为英伟达的显卡问题. 参考了如下这篇文章:Ubunt ...
- JAVA反射使用手记
本篇文章为在工作中使用JAVA反射的经验总结,也可以说是一些小技巧,以后学会新的小技巧,会不断更新.本文不准备讨论JAVA反射的机制,网上有很多,大家随便google一下就可以了. 在开始之前,我先定 ...