Debugging Tools for Windows

CDB 和 NTSD

CDB和NTSD是可以用来调试用户模式 程序的命令行工具。除了启动的方式之外,这两个工具基本上是一样的。

本文档将使用“CDB”来同时提及CDB和NTSD。除非专门注明,否则所有提到CDB的地方,同样适用于NTSD。只有极少数技术是只能在CDB上工作或者只在NTSD上工作的。这些不同点都会在适当的地方指明。

CDB

Microsoft控制台调试器(Microsoft Console Debugger (CDB))是基于控制台字符界面的程序,它可以对Windows用户模式的内存和结构进行低层次分析。

CDB在用于调试正在运行的或者刚刚崩溃的程序时(“live analysis”)非常强大,但是很容易配置。它可以用于研究正在运行的程序行为。在应用程序出错的情况下,CDB可以用于获得调用堆栈,或者查看有问题的参数。由于是基于字符界面,它能够很好的支持网络访问(使用远程访问服务器)。

使用CDB,可以显示和执行程序代码,设置断点,查看或者改变内存的值。CDB可以通过“反汇编”分析二进制代码并显示汇编代码,也可以直接分析源代码。

由于CDB能通过地址或者全局符号访问内存地址,你可以通过名字而不是地址来访问内存,这使得定位和调试特定的代码变的容易。也可以显示反汇编的机器码。CDB支持调试多个线程和进程。它是可扩展的,并能够读写分页和非分页内存。

如果目标应用程序本身也是控制台程序,目标和CDB将共用一个控制台。如果想和目标程序分开使用控制台,可以使用-2 命令行选项

NTSD

Microsoft NT Symbolic Debugger (NTSD)是CDB调试器的变种。启动的时候,NTSD会创建一个新的文本窗口,而CDB继承原有的命令行窗口,除此之外,他们没有任何区别。

和CDB一样,NTSD完全支持控制台程序和Windows程序。(命名为“控制台调试器”,是为了指明CDB是一个控制台程序,而非指目标程序必须是控制台程序。)

使用 start 命令也可分离出来新的控制台窗口,所以下面两种格式的命令会有相同效果:

start cdb parameters 
ntsd parameters 

System32目录下的NTSD

鉴于CDB只是Windows调试工具包的一部分,而NTSD同时包含在工具包和Windows系统中。所以在Windows的system32目录下可以找到NTSD。

如果准备使用在system32目录下的NTSD,有两个重要的地方需要注意:

为了避免这些问题,建议只使用Windows调试工具包中的NTSD和CDB。

用内核调试器控制CDB或者NTSD

CDB和NTSD的输入输出能够被重定向,所以可以通过内核调试器进行控制(KD或者WinDbg)。

这项技术如果用在CDB上,CDB的窗口将会出现,但是不能进行输入输出。如果使用在NTSD上,则不会有控制台窗口出现。

从内核调试器控制NTSD是非常有用的,因为它是一个非常轻量级的调试器,在运行目标程序的机器上,它几乎不会增加任何额外开销。这种结合可用于调试系统进程、关机、或者系统刚刚启动之后的情况。查看从内核调试器控制用户模式调试器获得更详细的信息。

Build machine: CAPEBUILD