DotNet程序的调试,是DotNet程序员必备的技能之一,开发出稳定的程序、解决程序的疑难杂症都需要很强大的调试能力。DotNet调试有很多方法和技巧。现在本文就介绍一下借助DebugView工具进行调试的方法,以及由DebugView引申出来的知识点。
DebugView
DebugView是一个查看调试信息的非常棒的工具,支持Debug、Release模式编译的程序,甚至支持内核程序,而且能够定制各种过滤条件,让你只看到关心的输出信息,而且可以定制高亮显示的内容等等,非常方便。
捕捉Release模式的Win32程序输出的调试信息,需要选中Capture Global Win32选项:
过滤与高亮功能
可以通过include、exclude设置过滤条件,包含指定字符串的输出信息将会被过滤。还可以通过exclude条件过滤掉对应进程ID的调试信息。多个条件使用“;”分隔,而且支持“*”通配符。
远程调试
DebugView支持远程捕捉调试信息。首先在远程机器上通过如下命令启动DebugView:
- DebugView.exe /a /t /g /s
复制代码
这样,DebugView就会以服务的方式运行,如下图:
然后在本地机器上启动DebugView,并通过Connect连接到远程机器的DebugView,当远程机器中有调试信息输出时,本地就会捕获到,并展示出来:
输出信息到DebugView的几种方式
DebugView的一些功能是不是让你心动了呢。俗话说心动不如行动,但是在行动之前,首先要知道C#如何将调试信息输出到DebugView中。
通过编程输出一些调试信息到DebugView中,一共有三种方式:
Debug.WriteLine
Debugger.Log
Kernal32.dll中的OutputDebugString方法
一、Debug.WriteLine
通过Debug.WriteLine可以将调试信息写入到DebugView中,如下:
- Debug.WriteLine("这是调试信息");
复制代码
效果如下:
不过此方式只能在Debug模式下有效。具体原因下面会详细介绍。
二、Debugger.Log
Debug.WriteLine已经很好用了,唯一的缺点就是在Release模式下无效。那么在Release模式下就可以使用Debugger.Log方法,示例如下:
- Debugger.Log(0, null, "这是Debugger.Log输出的调试信息");
复制代码
三、Kernel32.dll中的OutputDebugString方法
做C++开发的应该知道可以通过OutputDebugString这个API开实现输出调试信息到DebugView中吧。那么C++能做的,C#也能做。可以通过PInvoke的方式引入此方法,这个API属于Kernel32.dll,如下声明:
- [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
- public static extern void OutputDebugString(string message);
复制代码
然后就可以通过调用此方法,将调试信息输出到DebugView中。
建议大家用第三种方式,C#特别适合使用:
- using System.Text;
- using System.Runtime.InteropServices;
- namespace VisionDebug
- {
- public class CDebugView
- {
- [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
- private static extern void OutputDebugString(string message);
- public static void WriteDebugInfo(string strMsg)
- {
- StringBuilder sb = new StringBuilder();
- sb.AppendFormat("[Tls3DVision] {0}",strMsg);
- OutputDebugString(sb.ToString());
- sb.Clear();
- }
- }
- }
复制代码
新建上面的.cs文件后然后再需要使用的地方引入下命名空间VisionDebug即可(using VisionDebug;)
然后调用:
- CDebugView.WriteDebugInfo(" This is test code");
复制代码
编译软件,记住不要在VS里面调试运行看效果,因为VS已经拦截了调试信息显示到自己的输出里面了,要单独点击exe运行查看!
转载自:https://www.cnblogs.com/hbccdf/p/csharp_debug_induction.html
|