开启左侧

C#使用DebugView监听程序的调试信息

[复制链接]
绝地武士 发表于 2019-6-14 21:07:26 | 显示全部楼层 |阅读模式
DotNet程序的调试,是DotNet程序员必备的技能之一,开发出稳定的程序、解决程序的疑难杂症都需要很强大的调试能力。DotNet调试有很多方法和技巧。现在本文就介绍一下借助DebugView工具进行调试的方法,以及由DebugView引申出来的知识点。

DebugView
DebugView是一个查看调试信息的非常棒的工具,支持Debug、Release模式编译的程序,甚至支持内核程序,而且能够定制各种过滤条件,让你只看到关心的输出信息,而且可以定制高亮显示的内容等等,非常方便。
210000211464079.png
捕捉Release模式的Win32程序输出的调试信息,需要选中Capture Global Win32选项:
210000234438476.png
过滤与高亮功能
210000247879732.png
可以通过include、exclude设置过滤条件,包含指定字符串的输出信息将会被过滤。还可以通过exclude条件过滤掉对应进程ID的调试信息。多个条件使用“;”分隔,而且支持“*”通配符。

远程调试
DebugView支持远程捕捉调试信息。首先在远程机器上通过如下命令启动DebugView:
  1. DebugView.exe /a /t /g /s
复制代码

这样,DebugView就会以服务的方式运行,如下图:
210000259905032.png
然后在本地机器上启动DebugView,并通过Connect连接到远程机器的DebugView,当远程机器中有调试信息输出时,本地就会捕获到,并展示出来:
210000268656131.png

输出信息到DebugView的几种方式
DebugView的一些功能是不是让你心动了呢。俗话说心动不如行动,但是在行动之前,首先要知道C#如何将调试信息输出到DebugView中。

通过编程输出一些调试信息到DebugView中,一共有三种方式:
Debug.WriteLine
Debugger.Log
Kernal32.dll中的OutputDebugString方法

一、Debug.WriteLine
通过Debug.WriteLine可以将调试信息写入到DebugView中,如下:
  1. Debug.WriteLine("这是调试信息");
复制代码

效果如下:
210000286312559.png
不过此方式只能在Debug模式下有效。具体原因下面会详细介绍。

二、Debugger.Log
Debug.WriteLine已经很好用了,唯一的缺点就是在Release模式下无效。那么在Release模式下就可以使用Debugger.Log方法,示例如下:
  1. Debugger.Log(0, null, "这是Debugger.Log输出的调试信息");
复制代码

三、Kernel32.dll中的OutputDebugString方法
做C++开发的应该知道可以通过OutputDebugString这个API开实现输出调试信息到DebugView中吧。那么C++能做的,C#也能做。可以通过PInvoke的方式引入此方法,这个API属于Kernel32.dll,如下声明:
  1. [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
  2. public static extern void OutputDebugString(string message);
复制代码

然后就可以通过调用此方法,将调试信息输出到DebugView中。

建议大家用第三种方式,C#特别适合使用:
  1. using System.Text;
  2. using System.Runtime.InteropServices;

  3. namespace VisionDebug
  4. {
  5.     public class CDebugView
  6.     {
  7.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  8.         private static extern void OutputDebugString(string message);

  9.         public static void WriteDebugInfo(string strMsg)
  10.         {
  11.             StringBuilder sb = new StringBuilder();
  12.             sb.AppendFormat("[Tls3DVision] {0}",strMsg);
  13.             OutputDebugString(sb.ToString());
  14.             sb.Clear();
  15.         }
  16.     }
  17. }
复制代码

新建上面的.cs文件后然后再需要使用的地方引入下命名空间VisionDebug即可(using VisionDebug;)
然后调用:
  1. CDebugView.WriteDebugInfo(" This is test code");
复制代码

编译软件,记住不要在VS里面调试运行看效果,因为VS已经拦截了调试信息显示到自己的输出里面了,要单独点击exe运行查看!

转载自:https://www.cnblogs.com/hbccdf/p/csharp_debug_induction.html

郭培飞 发表于 2019-7-2 19:32:31 | 显示全部楼层
好方法,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表