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

简介

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

欢迎留言交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails

当ASP.NET Core 大约在 2.1 版本的时候,它引入了 ProblemDetails。ProblemDetails是基于 RFC7807 这个规范,目的是让 HTTP 响应可以携带错误的详细信息,而不是只返回一个错误的状态码。 在 ASP.NET Core 2.2的时候,如果Controller…

(译)An introduction to Kubernetes

原文:https://www.jeremyjordan.me/kubernetes/(博客园团队推荐的)这篇博客文章将对Kubernetes进行介绍,以便您了解该工具背后的动机,含义以及使用方式。在后续文章中,我将讨论如何使用更具体的&#xff08…

WeihanLi.Npoi 支持 ShadowProperty 了

WeihanLi.Npoi 支持 ShadowProperty 了Intro在 EF 里有个 ShadowProperty (阴影属性/影子属性)的概念,你可以通过 FluentAPI 的方式来定义一个不在 .NET model 里定义的属性,只能通过 EF 里的 ChangeTracker 来操作这种属性。在导出 Excel 的时候&#x…

RNN循环神经网络概述

RNN与普通神经网络的区别:能够更好的处理序列的信息 RNN结构图 如图所示,St的值不仅取决于输入X的值,还取决于St-1的值。同时,St-1的值还取决于St-2的值,因此S1,S2,…,St-1的值都与St的值直接或间接相关,…

使用ASP.NET Core 3.x 构建 RESTful API - 3.3.1 HTTP状态码

HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码。HTTP状态码一共分为5个级别: 1xx,属于信息性的状态码。Web AP…

解决import tensorflow时的报错 Passing (type, 1) or ‘1type‘ as a synonym of type is deprecate

问题 在Pycharm中运行import tensorflow as tf时报错。 解决方案 此时点开报错中的dtypes.py文件,对其进行修改。 从# hard-coding of names.这里开始,修改所有以_np_q开头的代码行,同时也要修改最后一行的np_resource。 # hard-coding of …

解决module ‘tensorflow‘ has no attribute ‘optimizers‘报错

一般出现此类问题的原因是包的更新导致有些用法发生了变化,因此在tensorflow中调用optimizer需要通过tf.keras调用。 将self.opt tf.optimizers.Adam(learning_rateself.lr)中的tf后面加个keras, 变成self.opt tf.keras.optimizers.Adam(learning_rat…

Dapr 运用

前置条件DockerWin10Dapr 部署本文将采用本地部署的方式。安装 Dapr CLI打开 Windows PowerShell 或 cmd ,运行以下命令以安装 Dapr CLI,并添加安装路径到系统环境变量中。powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/…

微软将中止支持 .NET Core 2.2,建议开发者升级至 .NET Core 3.1

Current 版本 .NET Core 2.2 将在 12 月 23 日结束生命周期,开发者应更新到长期支持版本 .NET Core 3.1。.NET Core 2.2 于 2018 年 12 月 4 日发布,作为一个非 LTS 版本(“Current”),它只在下一个版本发布后的三个月内受支持。.NET Core 3.…

LeetCode贪心 数组拆分I

Given an integer array nums of 2n integers, group these integers into n pairs (a1, b1), (a2, b2), …, (an, bn) such that the sum of min(ai, bi) for all i is maximized. Return the maximized sum. 思路 这道题要使得各最小值相加最小,就要使得的每一组…

使用.NET Core创建Windows服务 - 使用.NET Core工作器方式

原文:Creating Windows Services In .NET Core – Part 3 – The “.NET Core Worker” Way作者:Dotnet Core Tutorials译者:Lamond Lu译文:使用.NET Core创建Windows服务 - 使用.NET Core工作器方式使用.NET Core创建Windows服务…

LeetCode贪心 最长回文串

Given a string s which consists of lowercase or uppercase letters, return the length of the longest palindrome that can be built with those letters. Letters are case sensitive, for example, “Aa” is not considered a palindrome here. 思路 首先学习一个新单…

【译】Visual Studio 2019 中 WPF UWP 的 XAML 开发工具新特性

原文 | Dmitry翻译 | 郑子铭自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能。在本周的 Visual Studio 2019 版本 16.4 和 16.5 Preview 1中,我们希望借此机会回顾一下全年的新变化。如果您错过了我们以前的…

numpy创建zeros数组时报错TypeError: Cannot interpret ‘8‘ as a data type

错误代码 xPoint np.zeros(pow(2, k), pow(2, k))改正方法 zeros括号内填数组行列数时,加一对括号。 正确代码 xPoint np.zeros((pow(2, k), pow(2, k)))

我在外包公司做增删改查有前途么?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!起因这是我无意中在筛选简历时,看到一位朋友发布的求职说明中,明确指出,外包勿扰,并给出了他做出这个决定的理由:…

csv.reader读取txt中的文本数据

Python里读取txt文件的方法有很多,但numpy读取字符串比较困难,这时可以考虑使用csv库,读取txt文件中的每一行文本。 代码 data [] with open(*******.txt, rt) as csvfile:reader csv.reader(csvfile, delimiter,)for row in reader:data…

[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现

9月份的时候,微软宣布正式发布C#8.0,作为.NET Core 3.0发行版的一部分。C#8.0的新特性之一就是默认接口实现。在本文中,我们将一起来聊聊默认接口实现。众所周知,对现有应用程序的接口进行更改是一项很危险的操作。如果这个接口又…

Linux服务器 常用命令

定义当前文件夹中有result.txt 查看当前文件夹ls 查看当前路径pwd 进入目录homecd home 返回上一级目标cd .. 查看文件内容less result.txt 删除文件rm result.txt 查看进程信息top

鲲鹏来了,在EulerOS试用.NETCore-3.1

在EulerOS试用.NETCore-3.1前言EulerOS其实出来有一段时间了,一直在关注,单是仅仅也只是停留在观望的阶段,目前还没有接入的打算;正好看到园子里的兄弟分享了华为云免费试用的活动后,难捺激动的心情,我马上…

scp连接计算节点操作

定义计算节点为ip,计算节点用户名为name,待运行的文件名为file,其在登录节点的路径为path,登录节点文件夹名为log 登录计算节点 ssh nameip将登录节点的文件传输到计算节点 scp -r file nameip:path反之,将计算节点…