语法、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的更多相关文章

  1. jmeter sampler maven项目排错记

    eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...

  2. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  3. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  4. 设置tomcat远程debug

    查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...

  5. Android NDK debug 方法

    最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...

  6. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

    Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...

  7. struts debug 标签

    < s:debug> 引起下面的错误 org.apache.jasper.JasperException: Caught an exception while getting the pr ...

  8. 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 ...

  9. Debug Databinding Issues in WPF

    DataBinding is one of the most powerful features in WPF. But because it resolves the bindings at run ...

  10. Debug JDK变量显形

    本文面向的朋友 本文主要说明在使用Eclipse Debug JDK时,看不到变量值的解决办法. 如果您看到上面绿色字体表示不敢兴趣,请一定果断back,如果您不爽,请在下面使劲的拍. Debug J ...

随机推荐

  1. 后端程序员写的前端js代码模板

    看几天的javascript面向对象和基础等之类相关javascript的知识,因为自己是写php的,也写过java,所以想在写javascript代码的时候也能用上面向对象的思想, 折腾了一整天的j ...

  2. Windows上的git配置

    Git下载: 网站:https://code.google.com/p/msysgit/ 文件:https://msysgit.googlecode.com/files/Git-1.8.4-previ ...

  3. linux ntfs模块

    步骤: 1.在/usr/src/linux-2.4.18-3/configs/目录下 找适合自己机器的内核配置文件.我用的kernel-2.4.18-x86_64.config,把它拷贝到/usr/s ...

  4. python笔记20-yaml文件写入(ruamel.yaml)

    前言 yaml作为配置文件是非常友好的一种格式,前面一篇讲了yaml的一些基础语法和读取方法,本篇继续讲yaml文件写入方法 用yaml模块写入字典嵌套字典这种复杂的数据,会出现大括号{ },不是真正 ...

  5. Appium+python自动化22-Appium Desktop

    Appium Desktop 原滋原味的官方文档 Appium Desktop是一款用于Mac.Windows和Linux的开源应用,它提供了Appium自动化服务器在一个漂亮灵活的UI中的强大功能. ...

  6. Python学习(七)面向对象 ——封装

    Python 类的封装 承接上一节,学了Student类的定义及实例化,每个实例都拥有各自的name和score.现在若需要打印一个学生的成绩,可定义函数 print_score() 该函数为类外的函 ...

  7. linux开机启动的三种方式

    参考:www.cnblogs.com/gzggyy/archive/2012/08/07/2626574.html 一./etc/rc.local 其中的rc.local是在完成所有的系统初始化之后执 ...

  8. ASP.NET 5 的Roadmap(转)

    这次随 Visual Studio 2015 发布的 ASP.NET 版本是 ASP.NET 4.6 与 ASP.NET 5 beta5.在 VS2015 发布的同时,微软也发布了 ASP.NET 5 ...

  9. 1 cocos2dx源码分析-程序启动与主循环

        1 启动   在iOS系统中,由main函数启动默认调用了AppController main.m NSAutoreleasePool * pool = [[NSAutoreleasePool ...

  10. GOOGLE突破图书馆入口IP限制之技巧

    很多图书馆都要注册或要本地IP才能浏览或下载图书,有没有另类的快速办法能快速突破图书馆的入口,能随意地下载图书呢? 希望大家在GOOGLE里试试这个:“index of/ ” inurl:lib 你将 ...