简介

DebugViewsysinternals工具集中的一款用来查看调试信息的工具。不管你是内核开发人员还是应用程序开发人员,都会用到这款神器。先简单看看DebugView可以干什么吧。

  • 可以查看应用程序输出的调试信息。

  • 可以查看驱动程序输出的调试信息。

  • 可以查看本地机器的调试信息。

  • 可以查看远程机器的调试信息。

  • 可以根据规则高亮显示

  • 可以根据关键字过滤

  • 可以根据关键字搜索

  • 可以自动显示最新一条记录。

  • ……

功能太多太全了,有木有?心动了吗?快跟我一起来了解下这个神器吧。

如何输出调试信息

应用程序和驱动程序都可以通过对应的API生成调试信息。

  • 非托管应用程序可以通过Win32 API OutputDebugString()输出调试信息。

  • 托管应用程序可以通过System.Diagnostics.Debug.Print()输出调试信息,内部会调用OutputDebugString()

  • 驱动程序可以通过DbgPrint()DbgPrintEx()(或者使用KdPrintKdPrintEx宏)输出调试信息。这两个宏在Debug版里会分别映射到DbgPrint()DbgPrintEx(),在Release版会映射为空。

下图是一个使用DebugView捕获C++程序和C#程序输出的调试信息的截屏。

示例

基本功能

DebugView有一些值得我们了解的功能,下面列举了一些我用到的功能。

  • Options -> Show milliseconds 可以精确到毫秒,默认精确到秒。

  • Options -> Clock time (快捷键 CTRL + T),可以切换时间显示方式。

    有时候我们希望知道两条调试信息的时间差(估算某段代码的执行效率的时候),有时候我们希望知道某条调试信息具体的时间点,可以按CTRL + T快速切换。

    switch clocktime
  • Edit -> Filter/Highlight...可以过滤/高亮符合条件的记录。

    • 不相关的调试信息太多,看不过来怎么办?过滤功能可以帮助我们排除无用的调试信息。

    • 所有记录都是黑白的,区分起来太费劲,关键调试信息不够醒目。怎么办?高亮功能可以高亮显示包含特定关键字的调试信息。

点开下面的视频感受下吧!

过滤/高亮功能

  • 使用File -> New Window...可以快速启动DebugView的新实例。如果你需要监听多台机器的调试信息,此功能可能对你有用。

  • 使用Computer -> Connect...可以监视远程计算机的调试信息。

    监视远程机器的调试日志

使用此功能,需要注意以下事项:

  • 远端机器上必须以代理模式运行DebugView。可以通过dbgview.exe /a启动代理模式。更多选项,请参考DebugView的帮助文档,或者运行dbgView.exe -h查看。

  • 以代理模式运行的DebugView会监听TCP 2020端口,注意设置防火墙的例外规则。

  • DebugView可以同时连接并监视多台远程计算机。可以通过Computer->Disconnect来断开与某台计算机的连接。

  • 当前连接的机器名会在标题栏显示,注意看标题栏。

  • 不要让多个DebugView同时监听同一台机器的调试信息,否则会导致调试信息分别发送到不同的DebugView中,对我们排错产生不必要的干扰!

  • dbgView.exe -h可以查看DebugView支持的命令行参数及简短介绍。

    命令行选项
  • 其它

    • F1打开帮助文档。

    • CTRL + F查找符合条件的调试信息。

    • F3查看下一条查找到的记录。

    • CTRL + C复制选中的记录。

    • CTRL + S保存调试信息到文件中。

    • CTRL + X清空所有的调试信息。

    • CTRL + A开启或关闭自动滚屏。

    • ……

  • 更多功能,请参考《Windows Sysinternals 实战指南》。

如果遇到DebugView不能捕获调试信息的情况,可以从以下几个方面排查:

问题及解决方法

  • 如果应用程序正在被调试,那么DebugView捕获不到该程序的调试信息,请到调试器的输出窗口查看。具体原理可以参考张银奎老师的《软件调试》。

    DebugView捕获不到"C# Debug Message!"
  • 是否勾选了对应的捕获选项。有时候最简单的反而是最容易被我们忽略的。

    捕获选项
  • 检查当前的DebugView实例的连接状态,注意看标题栏。

    通过标题栏查看连接状态
  • win10系统中,无法捕获驱动程序输出的调试信息。

    首先,捕获驱动程序的调试信息,需要管理员权限,如果没有管理员权限,会报下图中的错误:

    需要管理员权限

其次,从Vista开始,需要设置注册表才能捕获。另存下面代码为Debug Print Filter.reg,双击导入注册表后,重启生效。

Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f

注册表对应的内容如下图所示:

具体原因请参考 http://www.osronline.com/article.cfm%5eid=295.htm,为了方便大家,我截取了该网址的内容:

  • 退出DebugView后,再次运行DebugView捕获内核调试信息会报下图中的错误:

    unable to access dbgv.sys

    从提示看,应该是Dbgv.sys被占用了。使用Process monitor查看DebugView的文件读写记录,印证了我们的猜测。

    dbgview-createfile-failed-event

本想通过process explorerFind Handle or DLL功能来查看是哪个进程在占用,未果!使用其它工具也没搜到相关信息。如果有哪位朋友知道如何查看驱动文件(*.sys)的占用情况,请告诉我!

no-search-result-of-dbgv

在网上搜到解决方案:只需要重命名Dbgv.sys即可。参考网址:https://www.cnblogs.com/jiaochen/p/5581440.html

说明: 这应该是老版本的一个bug,我在微软官网上下载最新的4.9版本的DebugView后,没有此问题了。建议大家下载最新版的DebugView使用。

广而告之

关于OutputDebugString()的实现原理,可以参考 张银奎老师的 《软件调试》(第一版)第1010.7节 输出调试字符串。《软件调试》这本调试领域的扛鼎之作不用我多做介绍吧?买就对了!不过第一版已经绝版了,好消息是:《软件调试》(第二版)卷 1:硬件基础 已经出版了。而且听张老师说,年底的时候, 《软件调试》(第二版)卷 2 有望出版(不过看这意思,2019年应该没戏了,希望2020年上半年能等到),对调试感兴趣的朋友有福了,多多关注下吧。

对了,张老师也有公众号的,大家可以搜索格友关注。

总结

  • 使用OutputDebugString()可以方便的输出调试信息。如果你还没在你的程序里加上调试信息的话,快快加上吧。注意不要把敏感信息输出来,别人用工具可以方便的查看到。切记!

  • DebugView是调试的好帮手。过滤和高亮功能可以让我们更加有效的查看我们关心的调试信息。

  • 《软件调试》详细讲述了OutputDebugString()的实现原理,感兴趣的小伙伴儿一定要看啊!

参考资料

  • 《Windows Sysinternals 实战指南》

  • 《软件调试》

  • OSR: Getting DbgPrint Output To Appear In Vista and Later[1]

  • dbgview 在 windows 10 中关闭后再次打开时无法 "capture kernel"[2]

References:

[1] OSR: Getting DbgPrint Output To Appear In Vista and Later:

http://www.osronline.com/article.cfm%5eid=295.htm

[2] dbgview 在 windows 10 中关闭后再次打开时无法 "capture kernel":

https://www.cnblogs.com/jiaochen/p/5581440.html

欢迎留言交流

你知道怎么使用DebugView查看调试信息吗?相关推荐

  1. DebugView输出调试信息

    在写windows程序时,需要输出一些调试信息,这里介绍一种极其方便的方法.即使用OutputDebugString 在Debug模式下输出调试信息,在Release模式下不输出. 我们可以在VS的集 ...

  2. DebugView无法显示调试信息问题

    从Vista开始,要从DebugView显示调试信息就必须在注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manag ...

  3. 在MFC,Win32程序中向控制台(Console)窗口输出调试信息

    在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...

  4. VC MFC 调试信息 DebugView

    11 一.如何使用DebugView.exe 打印调试信息: 捕捉Release模式的Win32程序输出的调试信息,请选中"Capture Global Win32"选项 只有调用 ...

  5. VC中自定义打印调试信息函数,打印调试信息到DebugView上

    该文档参考了以下网友的文章,在此表示感谢. 1. (更新)OutputDebugString函数简单封装,实现格式化打印输出(VC++) 链接:http://blog.csdn.net/sunflov ...

  6. 程序调试的时候利用Call Stack窗口查看函数调用信息

    http://blog.csdn.net/augusdi/article/details/6407422 http://blog.csdn.net/zhg598242449/article/detai ...

  7. 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧

    这是 Jerry 2021 年的第 43 篇文章,也是汪子熙公众号总共第 320 篇原创文章. 做 Web 开发的程序员,无论使用 SAP UI5,还是 Angular,React,Vue,每天都离不 ...

  8. Win7 32位下DebugView和DriverMinitor不能打印调试信息的问题

    使用DebugView打印内核调试信息是开发驱动的非常重要的手段,但DebugView在VISTA/WINDOWS 7下却无法获取内核的调试日志,修改方法是: HKLM/SYSTEM/CurrentC ...

  9. 微信开发者工具-真机调试,可查看接口信息

    之前测试小程序查看接口信息,是需要打开调试模式,手机界面小,看着多多少少有点不方便. 现在发现了可以直接找前端要文件包,用[微信开发者工具]打开该文件包,然后选择[真机调试]-[二维码真机调试],生产 ...

最新文章

  1. poj2186(强连通分量分解)
  2. 导入Flex/Flash项目后的一个简单错误:无法创建 HTML 包装器
  3. 一位刚刚成功上岸的智能车队员对于参赛经历总结与对比赛的建议
  4. windows下 网络命令(待续)
  5. python中遍历结构可以是哪些数据类型_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...
  6. 前端做后台管理系统有前途吗_关于后台管理系统前端项目的思考
  7. 横扫阿里、滴滴、美团后,阿里程序媛整理出这份厚厚的面经!
  8. 找不到aspnet用户权限的解决方法
  9. Java运行Shell脚本
  10. 安装pycuda的正确办法
  11. 大数据时代背景下智能工厂的能源管理系统
  12. 微信小程序的两种视频录制方式
  13. java中raiseSalary_用Java编写常用的工资管理系统,目的是把每个人的工资上涨百分之五...
  14. c语言erfc函数,erf、erff、erfl、erfc、erfcf、erfcl
  15. QCC51XX---如何修改MDE的主题
  16. mcs51单片机嵌入式c语言习题,MCS-51单片机复习题参考题库.doc
  17. Appollo高精度地图
  18. 思岚科技Athena打破机器人底盘价格极限
  19. android 集成高德地图打包后报 key-location Error, ErrCode:7 的问题
  20. c++ 旅行家的预算

热门文章

  1. SQL Server索引进阶第十篇:索引的内部结构
  2. CSS/DIV网页设计视频教程目录【转】
  3. 在Firefox中结合Wolfram Alpha和Google搜索结果
  4. windows os x_如何立即在OS X上获取Windows样式的窗口捕捉
  5. Ethereum-EIPs
  6. bzoj3160(FFT+回文自动机)
  7. 如果把整个因特网都印出来 你认为会怎么样
  8. 试着翻译24小时自学SQL第四版
  9. WPF 实现截屏控件之移动(二)(仿微信)
  10. WPF中的触发器(Trigger)