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

基本功能
DebugView有一些值得我们了解的功能,下面列举了一些我用到的功能。
Options->Show milliseconds可以精确到毫秒,默认精确到秒。Options->Clock time(快捷键CTRL + T),可以切换时间显示方式。有时候我们希望知道两条调试信息的时间差(估算某段代码的执行效率的时候),有时候我们希望知道某条调试信息具体的时间点,可以按
CTRL + T快速切换。
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实例的连接状态,注意看标题栏。
在
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^id=295.htm,为了方便大家,我截取了该网址的内容:

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

在网上搜到解决方案:只需要重命名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
[原]你知道怎么使用DebugView查看内核调试信息吗?的更多相关文章
- Android 通过USB查看kernel调试信息【转】
本文转载自:http://blog.csdn.net/lindonghai/article/details/51683644 前提:电脑已安装adb并可正常使用. 在调试Android驱动时,需要查看 ...
- 查看内核打印信息指令dmesg
linux系统启动的时候打印的的信息非常重要,有时候需要看这些信息但是又不想重启,可以用dmesg这条指令.
- Windows 7下在DebugView中显示调试信息
自Windows Vista以来,调试信息在默认状态下是不显示的.为了显示调试信息,按照如下步骤设置即可: 1. 打开注册表: 2. 在HKLM\SYSTEM\CuurentControlSet\Co ...
- [linux系统]查看内核版本和系统版本方法
查看内核版本信息的两个命令: uname -a cat /proc/version 查看系统版本的命令: lsb_release -a more /etc/issue cat /etc/redhat- ...
- linux系统如何查看内核版本、操作系统版本等信息
有时候需要查看linux系统的内核版本,可以有多种方法,方法如下:(下面以优麒麟系统为例) 方法1: 打开mate终端,在命令行输入以下命令: uname -a 运行效果如下: 如果只查看内核 ...
- 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建 ...
- Linux系统资源查看 之 资源信息
1. 系统 版本信息 内核版本 使用 uname 命令: -a : 查看所有系统信息 -r : 查看内核版本信息 -s : 查看内核名称 代码如下: [niesh@niesh ~]$ uname -a ...
- 内核调试神器SystemTap — 简介与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简介 SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说 ...
- 内核调试神器SystemTap — 简单介绍与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚 ...
随机推荐
- 134-PHP子类重写父类方法,并调用父类方法
<?php class father{ //定义father类 public function method(){ //定义方法 echo '<br />father method' ...
- String巩固
About String in Java 如今做了一个重大决定,不定期温习The Basement Of Java String对象的认知简述 首先 String不属于 8种基本数据类型, Strin ...
- Swift 类的使用class
/* 类属性的介绍 Swift中类的属性有多种 1.存储属性:存储示例的常量和变量 2.计算属性:通过某种方式计算出来的属性 3.类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作 ...
- Swift泛型定义 同时限定T的类(class)和多协议(protocol)
https://blog.csdn.net/weixin_34054931/article/details/88027728 swift 可以定义模板函数,如: func testFunc<T& ...
- Flink 笔记(一)
简介 Flink是一个低延迟.高吞吐.统一的大数据计算引擎, Flink的计算平台可以实现毫秒级的延迟情况下,每秒钟处理上亿次的消息或者事件. 同时Flink提供了一个Exactly-once的一致性 ...
- 【LeetCode】509. 斐波那契数
题目 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = ...
- 编程入门-Eclipse项目导出和导入
编程入门-Eclipse项目导出和导入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.导出项目 1>.如下图所示,在项目目录上右击鼠标,依次点击"Export& ...
- fork系统调用方式成为负担,需要淘汰
微软研究人员发表论文称用于创建进程的 fork 系统调用方式已经很落后,并且对操作系统的研究与发展产生了极大的负面影响,需要淘汰,作者同时提出了替代方案.相信每位开发者都对操作系统中的 fork () ...
- POJ 1050:To the Max
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43241 Accepted: 22934 Desc ...
- pytorch文档学习笔记(2)
三.CUDA semantics 二.Broadcasting semantics 广播机制 广播机制要第一项对齐,第一项对齐后(相等)才能广播,或者某个第一项为1. 但如果两个size个数相等,则 ...









