关于OutputDebugString在WinDbg与DebugView中的使用及问题
调试工具相关问题解答
背景
使用DebugView时,可通过OutputDebugString(简称ODS)发送"DBGVIEWCLEAR"清空输出窗口,再通过定时器每秒10次输出10行信息。但启动WinDbg后,DebugView无法捕获ODS输出。
Q1:能否让WinDbg忽略/透传ODS输出,使DebugView可以捕获?
可以通过WinDbg内置命令调整输出捕获行为:
- 执行命令
!dbgout -d,禁用WinDbg对ODS输出的捕获,此时DebugView就能正常接收进程发送的ODS消息 - 若需要恢复WinDbg的ODS捕获功能,执行
!dbgout +d即可
Q2:如何通过ODS清空WinDbg的输出窗口?
你之前的写法报错是因为.cls与g命令不能直接用分号串联执行,正确的实现方式有两种:
- 拆分两次发送ODS消息:
OutputDebugString("WINDBGCMD .cls"); OutputDebugString("WINDBGCMD g"); - 用
.command包裹组合命令,避免语法错误:OutputDebugString("WINDBGCMD .command \".cls;g\"");
两种方式都能实现清空WinDbg输出窗口并让程序继续运行的效果。
Q3:是否存在可通过WM_COPYDATA通信,能清空自身输出窗口并显示指定10行信息的外部应用?TraceTool似乎可行但较复杂,且似乎仅支持C++而非C。
- 最轻量化的方案是自己用纯C编写一个简单的外部程序:
- 注册窗口类并创建一个简单的窗口
- 处理
WM_COPYDATA消息,解析传递的数据包(比如定义一个结构体,包含清空标记、文本行数、每行内容) - 收到清空指令时调用
InvalidateRect刷新窗口实现清空,再用DrawText或TextOut绘制指定的10行信息
整个实现不需要复杂框架,纯C就能完成,完全适配需求。
- 若不想自行开发,也可以选择轻量开源的调试日志工具,这类工具大多支持
WM_COPYDATA通信,且兼容C语言调用,比TraceTool更易用。
内容的提问来源于stack exchange,提问作者aleksazr
相关产品推荐
相关产品推荐

