Windbg调试命令详解

转载注明>> 作者:张佩】【原文:http://www.yiiyee.cn/Blog】

1. 概述

用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe、ntsd.exe、kd.exe和Windbg.exe。其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作。

Windbg.exe在用户态、内核态下都能够发挥调试功能,尤其重要的是,它不再是命令行格式而是采用了可视化的用户界面。所以绝大部分情况下,我们在谈及Windows调试工具的时候,都直接指向Windbg,而不大谈及前三者。

Windbg在用户态和内核态下,都支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”。所谓实时模式,是被调试的目标对象(Target)当前正在运行当中,调试器可以实时分析、修改被调试目标的状态,如寄存器、内存、变量,调试exe可执行程序或双击实时调试都属于这种模式;所谓事后模式,是被调试的目标对象(Target)已经结束了,现在只是事后对它保留的快照进行分析,这个快照称为转储文件(Dump文件)。

Windbg另一个重大优点,还在于它支持源码级的调试,就像VC自带的调试器一样。

虽然提供了用户界面,但Windbg归根结底还是需要用户一个个地输入命令来指挥其行动。这就是他的Command窗口。

每个调试命令都各有使用范围,有些命令只能用于内核调试,有些命令只能用于用户调试,有些命令只能用于活动调试。但用户也不必记得这许多,一旦在某个环境下,使用了不被支持的命令,都会显示“No export XXX found”的字样。就拿!process命令来说吧,它显示进程信息,但只能用于内核调试中,如果在用户调试中使用,就是下面的情景:

1.1 寻求帮助

我们首先来看如何在使用过程中获取有用的帮助。Windbg中的调试命令,分为三种:基本命令,元命令和扩展命令。基本命令和元命令是调试器自带的,元命令总是以“.”开头,而扩展命令是外部加入的,总是以感叹号“!”开头。各种调试命令成千上万,我们首先要想办法把它们都列举出来,并取得使用方法。

基本命令最少了,大概40个左右。列举所有的基本命令,使用如下命令:

  • /strong>

元命令有一百多个,使用下面命令列举所有元命令:

  • .help  [/D]

如使用“/D”参数,命令列表将以DML格式显示。DML是一种类似于HTML的标识语言,下面会讲到。下图以DML格式显示所以有字母a开头的元命令:

Windbg调试命令详解

最后讲扩展命令。所谓扩展命令,顾名思义是可以“扩展”的。扩展命令从动态连接库中暴露出来,一般以DLL文件名来代表一类扩展命令集,首先我们要搜索出系统中有多少个这样的DLL文件,使用下面命令:

  • .chain  [/D]

此命令能够给出一个扩展命令集的链表。和.help命令一样,也可以使用/D参数以DML格式显示。如下所示:

            最上面两行显示了扩展模块的搜索路径。接下来共列出了六个Windbg自带的扩展模块:wdfkd、dbghellp、ext、exts、uext和ntsdexts。可以查看到这些扩展模块的版本信息、镜像文件路径。如何列出某个扩展库中所包含的扩展命令列表呢大部分扩展模块可使用如下命令:

  • !模块名.help

此外,扩展命令模块是可“扩展”的。如果读者从第三方处获取,或自己编写了一个扩展调试模块,则可通过.load/.unload命令动态加载/卸载。

1.2 DML语言

DML(Debugger Markup Language调试器标记语言)像HTML一样,可从一处链接到另一处。不同处在于,DML的链接内容需要用户点击后才会动态生成。一般用来以精简方式显示大量信息和扩展功能。

DML有很多实用的功能,如果使用者一时不知道从何下手,最好就是输入.dml_start命令,开始DML之旅。

Windbg调试命令详解

DML链接以更加可视化的方式,引导用户查看调试信息,使得调试工具的使用相比纯指令格式而言,更为友好。DML如同是对原指令的一层轻微的包装一样,让生硬的指令更加温和了。所以建议读者总是把DML默认开启。

  • .prefer_dml  1

开始DML。

  • .prefer_dml  0

关闭DML。

一旦开启DML后,像k等支持DML的调试命令,将默认以DML格式显示输出内容。

DML还能以一种很特殊的方式为函数画流程图。它主要的原理是使用反汇编,类似于uf,但在逻辑分支处,它会停止反汇编并显示分支让用户选择。另外,它能显示汇编代码对应的行号,这一点真的非常好。如果稍加精进,他就能画出非常漂亮的流程图了。他的一个特点是反汇编的顺序是从后往前推。只要细想一想,就会觉得很有道理。如果正推的话,分支太多;而反推则分支顺序在用户的参与下(即用户进行分支选择),是固定了的。

  • .dml_flow  FindAllInfFilesA  FindAllInfFilesA+30

这是一个非常简单、实用的例子,对Kernel32库中的FindAllInfFilesA接口函数进行反汇编,效果类似uf命令却更强大。

1.3 基本信息

本节讲解和调试器软件本身相关的命令,比如:查看软件版本、启动参数,以及最基本的软件设置命令。首先看版本命令:

  • version

此命令显示操作系统的版本信息以及Windbg本身的版本信息,Windbg的配置和操作系统密切相关,所以将操作系统的版本信息一并显示出来是很有必要的。在内核环境与用户环境下运行此命令,会得到不同的输出。下图为内核环境下输出结果:

除了Windbg版本信息,上面的输出中还包括目标系统信息。如果纯粹是为了查看目标系统的版本信息,可使用下面的vertarget命令:

  • vertarget

Windbg支持对多个调试系统中的多个调试目标同时进行调试。上面我们通过version或vertarget命令列出了当前调试系统的版本信息,还可以查看当前目标系统的状态:

  • ||

如Windbg中同时打开多个调试对象,“||”命令将列出对象列表。笔者为了演示此种情况,先在Windbg中开启Local Debug环境,然后两次调用.opendump命令打开两个DUMP文件,这样就同时拥有了三个被调试的目标对象。下图显示了这个情况:

Windbg调试命令详解

            上图中的活动对象是0号对象(可从数字0前面的小数点看出)。调试器需要在多个调试目标之间进行切换的话,使用“s”参数。如要切换到1号目标可使用下面的命令:

  • ||  1  s

最后一个命令用来查看系统时间。这包括系统当前时间,以及系统正常运行持续时间;用户模式下还会显示当前进程的持续时间。命令格式如下:

  • .time

1.4 基本设置

首先看一个清屏命令:

  • .cls

当命令窗口中的内容太乱的时候,这个命令帮你快刀斩乱麻。

下面看一个设置默认数字进制的命令:

  • n  [8|10|16]

软件默认是16进制,但有时候我们也需要把默认进制改成八进制或十进制的。下面尝试在八进制下面求数字11的值,如下:

最后再来说一个处理器模式指令。关于处理器模式很值得一说,很重要。处理器模式的设置,反映了Windbg软件的强大。举例来说,主机为32位的系统,却可以同时调试X86、IA64、X64的目标系统——前提是先将主机的处理器模式设置正确了。可用处理器模式值有:x86、adm64、ia64、ebc。

  • .effmach  x86

命令.effmach表示Effective Machine Type,即有效的机器类型。此命令将当前的处理器模式设置为x86模式。

1.5 格式化显示

将一个整数以各种格式显示,包括:16进制、10进制、8进制、二进制、字符串、日期、浮点数等。是不是很方便个命令是:

  • .formats  整数

下面以0x123abc为例:

1.6 开始调试

现在领大家进入调试阶段。首先看看如何让调试器附载到一个已运行的进程中去如IE软件在运行过程中发生了崩溃,打开Windbg后如何调试呢一步就是把Windbg附载到发生崩溃的IE进程上。使用如下命令格式:

  • .attach  PID

或者通过Windbg的启动参数进行挂载:

  • Windbg –p PID

上面两个命令中,PID指定了进程ID。如果觉得指定PID不方便,也可以通过进程名进行挂载:

  • Windbg -pn 进程名

来源:Boy_Kris

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2014年1月24日
下一篇 2014年1月24日

相关推荐