VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 302|回复: 5

[原创] 你知道怎么使用DebugView查看内核调试信息吗?

[复制链接]
70_avatar_middle
最佳答案
0 
在线会员 发表于 2019-12-21 08:11:32 | 显示全部楼层 |阅读模式
本文最早发布在我的博客和微信公众号


简介DebugView是sysinternals工具集中的一款用来查看调试信息的工具。不管你是内核开发人员还是应用程序开发人员,都会用到这款神器。先简单看看DebugView可以干什么吧。
  • 可以查看应用程序输出的调试信息。
  • 可以查看驱动程序输出的调试信息。
  • 可以查看本地机器的调试信息。
  • 可以查看远程机器的调试信息。
  • 可以根据规则高亮显示
  • 可以根据关键字过滤
  • 可以根据关键字搜索
  • 可以自动显示最新一条记录。
  • ……
功能太多太全了,有木有?!心动了吗? 快跟我一起来了解下这个神器吧。
如何输出调试信息应用程序和驱动程序都可以通过对应的API生成调试信息。
  • 非托管应用程序可以通过Win32 API OutputDebugString()输出调试信息。
  • 托管应用程序可以通过System.Diagnostics.Debug.Print()输出调试信息,内部会调用OutputDebugString()。
  • 驱动程序可以通过DbgPrint()或DbgPrintEx()(或者使用KdPrint或KdPrintEx宏)输出调试信息。这两个宏在Debug版里会分别映射到DbgPrint()或DbgPrintEx(),在Release版会映射为空。

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

你知道怎么使用DebugView查看内核调试信息吗?
基本功能DebugView有一些值得我们了解的功能,下面列举了一些我用到的功能。
  • Options -> Show milliseconds 可以精确到毫秒,默认精确到秒。
  • Options -> Clock time (快捷键 CTRL + T),可以切换时间显示方式。
    有时候我们希望知道两条调试信息的时间差(估算某段代码的执行效率的时候),有时候我们希望知道某条调试信息具体的时间点,可以按CTRL + T快速切换。
    你知道怎么使用DebugView查看内核调试信息吗?
  • Edit -> Filter/Highlight...可以过滤/高亮符合条件的记录。
    • 不相关的调试信息太多,看不过来怎么办?过滤功能可以帮助我们排除无用的调试信息。
    • 所有记录都是黑白的,区分起来太费劲,关键调试信息不够醒目。怎么办?高亮功能可以高亮显示包含特定关键字的调试信息。
    点开下面的视频感受下吧!
    你知道怎么使用DebugView查看内核调试信息吗?
  • 使用File -> New Window...可以快速启动DebugView的新实例。如果你需要监听多台机器的调试信息,此功能可能对你有用。
  • 使用Computer -> Connect...可以监视远程计算机的调试信息。
    你知道怎么使用DebugView查看内核调试信息吗?
    • 远端机器上必须以代理模式运行DebugView。可以通过dbgview.exe /a启动代理模式。更多选项,请参考DebugView的帮助文档,或者运行dbgView.exe -h查看。
    • 以代理模式运行的DebugView会监听TCP 2020端口,注意设置防火墙的例外规则。
    • DebugView可以同时连接并监视多台远程计算机。可以通过Computer->Disconnect来断开与某台计算机的连接。
    • 当前连接的机器名会在标题栏显示,注意看标题栏。
  • 不要让多个DebugView同时监听同一台机器的调试信息,否则会导致调试信息分别发送到不同的DebugView中,对我们排错产生不必要的干扰!
  • DbgView.exe -h可以查看DebugView支持的命令行参数及简短介绍。
    你知道怎么使用DebugView查看内核调试信息吗?
  • 其它
    • F1打开帮助文档。
    • CTRL + F查找符合条件的调试信息。
    • F3查看下一条查找到的记录。
    • CTRL + C复制选中的记录。
    • CTRL + S保存调试信息到文件中。
    • CTRL + X清空所有的调试信息。
    • CTRL + A开启或关闭自动滚屏。
    • ……
  • 更多功能,请参考《Windows Sysinternals 实战指南》。

如果遇到DebugView不能捕获调试信息的情况,可以从以下几个方面排查:
问题及解决方法
  • 如果应用程序正在被调试,那么DebugView捕获不到该程序的调试信息,请到调试器的输出窗口查看。具体原理可以参考张银奎老师的《软件调试》。
    你知道怎么使用DebugView查看内核调试信息吗?

  • 是否勾选了对应的捕获选项。有时候最简单的反而是最容易被我们忽略的。
    你知道怎么使用DebugView查看内核调试信息吗?
  • 检查当前的DebugView实例的连接状态,注意看标题栏。
    你知道怎么使用DebugView查看内核调试信息吗?
  • 在win10系统中,无法捕获驱动程序输出的调试信息。
    首先,捕获驱动程序的调试信息,需要管理员权限,如果没有管理员权限,会报下图中的错误:
    你知道怎么使用DebugView查看内核调试信息吗?

      其次,从Vista之后,需要设置注册表才能捕获。另存下面代码为Debug Print Filter.reg,双击即可。
[tr][/tr][/table][table]
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f

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

你知道怎么使用DebugView查看内核调试信息吗?


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

你知道怎么使用DebugView查看内核调试信息吗?


  • 退出DebugView后,再次运行DebugView捕获内核调试信息会报下图中的错误:
    你知道怎么使用DebugView查看内核调试信息吗?
    从提示看,应该是Dbgv.sys被占用了。使用Process monitor查看DebugView的文件读写记录,印证了我们的猜测。
    你知道怎么使用DebugView查看内核调试信息吗?
本想通过process explorer的Find Handle or DLL功能来查看是哪个进程在占用,未果!使用其它工具也没搜到相关信息。如果有哪位朋友知道如何查看驱动文件(*.sys)的占用情况,请告诉我!
你知道怎么使用DebugView查看内核调试信息吗?

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

说明: 这应该是老版本的一个bug,我在微软官网上下载最新的4.9版本的DebugView后,没有此问题了。建议大家下载最新版的DebugView使用。
广而告之关于OutputDebugString()的实现原理,可以参考 张银奎老师的 《软件调试》(第一版)第10章 10.7节 输出调试字符串。《软件调试》这本调试领域的扛鼎之作不用我多做介绍吧?买就对了!不过第一版已经绝版了,好消息是:《软件调试》(第二版)卷 1:硬件基础 已经出版了。而且听张老师说,年底的时候, 《软件调试》(第二版)卷 2 有望出版(不过看这意思,2019年应该没戏了,希望2020年上半年能等到),对调试感兴趣的朋友有福了,多多关注下吧。
对了,张老师也有公众号的,大家可以搜索格友关注。
总结
  • 使用OutputDebugString()可以方便的输出调试信息。如果你还没在你的程序里加上调试信息的话,快快加上吧。注意不要把敏感信息输出来,别人用工具可以方便的查看到。切记!
  • DebugView是调试的好帮手。过滤和高亮功能可以让我们更加有效的查看我们关心的调试信息。
  • 《软件调试》详细讲述了OutputDebugString()的实现原理,感兴趣的小伙伴儿一定要看啊!
参考资料
  • 《Windows Sysinternals 实战指南》
  • 《软件调试》
  • OSR: Getting DbgPrint Output To Appear In Vista and Later
  • dbgview 在 windows 10 中关闭后再次打开时无法 capture kernel
         
  •     本文作者:    BianChengNan
  •     本文链接:    https://bianchengnan.gitee.io/articles/DebugView-Usage/
  •     版权声明:     本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  •     作者寄语:     文章的结束只是思考的开始,您宝贵的意见和建议将是我继续前行的动力,点击右侧分享按钮即可携友同行!
      





上一篇:今日一贴,发一个让程序增加托盘图标的方法
下一篇:调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
75_avatar_middle
最佳答案
18 
online_supermod 发表于 2019-12-21 09:48:24 | 显示全部楼层
这个  厉害了    学习一下
58_avatar_middle
最佳答案
31 
online_vip 发表于 2019-12-21 15:08:12 | 显示全部楼层
mark一下,好文章,至少排版是真好。
70_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-12-22 13:40:55 | 显示全部楼层
wl1383838438 发表于 2019-12-21 09:48
这个  厉害了    学习一下

感谢版主鼓励
70_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-12-22 13:42:25 | 显示全部楼层
thzzl 发表于 2019-12-21 15:08
mark一下,好文章,至少排版是真好。

额 感谢鼓励你知道怎么使用DebugView查看内核调试信息吗?
81_avatar_middle
最佳答案
1 
在线会员 发表于 2020-1-13 21:44:05 | 显示全部楼层
mark一下,看看以后能否再学习
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-5-30 00:10

Powered by CcTry.CoM

© 2009-2020 cctry.com

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