目录
- 一、前言
- 二、本机调试
- 1.DebugView程序文件说明
- 2.OutputDebugString函数使用
- 3.示例程序
- 4.远程调试
- 三、问题与注意事项
- 四、小结
一、前言
DebugView是windows下的一款调试工具,可以捕获程序输出的日志,分为64位和32位,支持应用层和内核层的日志捕获,利用它排除bug是个不错的选择。本文主要关注应用层面的使用。
一般程序日志记录可以输出到文件进行查看,但是使用DebugView不会自动输出到文件,它的日志信息是驻留在进程内存中。
二、本机调试
1.DebugView程序文件说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/8322c46457a444ab9edd8e24a43f9702.png)
Dbgview.chm: 帮助文档
Dbgview.exe:捕获32位进程的日志输出
Dbgview64.exe/Dbgview64a.exe: 捕获64位进程的日志输出,有平台相关性
DebugView主界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/d70733a3427b48c1b355859f50d48501.png)
2.OutputDebugString函数使用
OutputDebugString是一个Windows Api函数,可以在应用程序中使用。它的作用是发送日志,而DebugView是接收日志,。捕获的时候需要提前启动DebugView,当然不启动DebugView的话应用程序也不会因此而崩溃。
它的ANSI和UNICODE版本签名为
WINBASEAPI VOID WINAPI OutputDebugStringA(_In_opt_ LPCSTR lpOutputString);
WINBASEAPI VOID WINAPI OutputDebugStringW(_In_opt_ LPCWSTR lpOutputString);
在C#中调用该方法
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern void OutputDebugString(string message);
System.Diagnostics.Trace.WriteLine也可以实现和OutputDebugString类似的效果
3.示例程序
测试代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace DebugViewTest
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern void OutputDebugString(string message);
static void Main(string[] args)
{
Console.WriteLine("BEGIN");
for (int i = 0; i < 10; i++)
{
OutputDebugString("debugstring");
System.Diagnostics.Trace.WriteLine("tracestring");
}
Console.WriteLine("END");
}
}
}
运行测试程序,查看DebugView的日志列表
DebugView会默认连接到 本机local
在C#中调用时不管编译的是Debug还是Release都是能正常捕获的
4.远程调试
远程调试需要在本地和远程机器上都启动DebugView进程
远程机器作为接收请求的一端,需要在命令行下加参数启动 ,即 dbgview /a
可以使用 tasklist /fi “imagename eq dbgview.exe” 命令得到dbgview的进程id
再结合 netstat -ano | find 命令找到dbgview监听的端口
如图所示,dbgview默认监听2020端口
本机作为请求的一端,可以通过菜单栏的 “Connect” 按钮连接到远程的DebugView
需要先断开到本地的默认连接
三、问题与注意事项
1.服务进程监控
DebugView默认捕获应用层普通的win32应用程序,菜单栏默认 勾选 “Capture Win32”
如果被监控进程是以windows服务形式存在的,那么需要使用管理员权限启动DebugView进程
然后在DebugView菜单栏勾选 “Capture Global Win32”
勾选 "Capture Kernel"会对内核的日志输出进行捕获
2.一些服务器防火墙开启的情况下,需要对dbgview监听的端口进行放行
四、小结
工欲善其事必先利其器,所以选择一个合适的工具是多么的重要。debugview不仅能够监控本地进程日志输出还能够监控远程进程的日志输出,还是很有实用性。