地狱怪客

Debugging Tools for Windows CDB命令行

原文:http://www.dbgtech.net/windbghelp/hh/debugger/r12_cmdline_3ec269e8-a2d8-43e4-8758-2201481cd323.xml.htm

首次使用CDB或NTSD的用户应该从调试器操作节开始阅读。

CDB命令行使用如下语法:

cdb  -server ServerTransport | -remote ClientTransport ]
-premote SmartClientTransport ] [-log{o|aLogFile]
[-2] [-d] [-ddefer] [-g] [-G] [-hd] [-lines] [-myob] [-bonc]
[-n] [-o] [-s] [-v] [-w] [-cf “filename] [-cfr “filename] [-c “command]
[-robp] [-r BreakErrorLevel]  [-t PrintErrorLevel]
-x{e|d|n|iException ] [-x] [-clines lines]
[-i ImagePath]  [-y SymbolPath] [-srcpath SourcePath]
[-aExtension] [-failinc] [-noio] [-noinh] [-noshell]
[-sdce] [-ses] [-sicv] [-sins] [-snc] [-snul] [-zp PageFile]
[-sup] [-sflags 0xNumber] [-ee {masm|c++}] [-vf[:Flags]]
[-e Event] [-pb] [-pd] [-pe] [-pr] [-pt Seconds] [-pv]
 | -p PID | -pn Name | -psn ServiceName | -z DumpFile | executable ]

cdb -iae

cdb -iaec KeyString

cdb -iu

cdb -QR Server

cdb -wake pid

cdb -?

NTSD命令行语法和CDB一样:

ntsd  -server ServerTransport | -remote ClientTransport ]
-premote SmartClientTransport ] [-log{o|aLogFile]
[-2] [-d] [-ddefer] [-g] [-G] [-hd] [-lines] [-myob] [-bonc]
[-n] [-o] [-s] [-v] [-w] [-cf “filename] [-cfr “filename] [-c “command]
[-robp] [-r BreakErrorLevel]  [-t PrintErrorLevel]
-x{e|d|n|iException ] [-x] [-clines lines]
[-i ImagePath]  [-y SymbolPath] [-srcpath SourcePath]
[-aExtension] [-failinc] [-noio] [-noinh] [-noshell]
[-sdce] [-ses] [-sicv] [-sins] [-snc] [-snul] [-zp PageFile]
[-sup] [-sflags 0xNumber] [-ee {masm|c++}] [-vf[:Flags]]
[-e Event] [-pb] [-pd] [-pe] [-pr] [-pt Seconds] [-pv]
 | -p PID | -pn Name | -psn ServiceName | -z DumpFile | executable ]

ntsd -iae

ntsd -iaec KeyString

ntsd -iu

ntsd -QR Server

ntsd -wake PID

ntsd -?

NTSD和CDB唯一的不同在于NTSD会分离一个新的控制台窗口而CDB继承运行它的控制台窗口。由于start命令也会产生一个新的控制台窗口,所以下面两条命令具有相同的效果:

start cdb [parameters]
ntsd [parameters]

下面是CDB和NTSD命令行选项的说明。仅有-remote, -server-g-G 选项是区分大小写的。前面的连字号也可以用斜杠(/)代替。不带任何参数的选项可以连载一起 — 所以cdb -o -d -G -g winmine可以写成cdb -odGg winmine

如果使用了-remote-server选项,它们必须出现在命令行中其他任何选项之前。如果指定了executable,它必须位于命令行的末尾,任何在executable 名字之后的文本都被当作可执行程序自己的命令行参数传递给它。

参数

-server ServerTransport
创建一个可以用其他调试器访问的调试服务器。关于可能的ServerTransport 值的说明,查看激活调试服务器。使用时,必须作为命令行的第一个参数。
-remote ClientTransport
创建一个调试客户端,并连接到已经运行的调试服务器上。关于ClientTransport 可能的值的说明,查看激活调试客户端。使用时,必须作为命令行的第一个参数。
-premote SmartClientTransport
创建一个灵巧客户端,并且连接到已运行的进程服务器上。关于SmartClientTransport 的可能值的说明,查看激活灵巧客户端
-2
如果目标程序是控制台应用程序,该选项使得他被运行在一个新的控制台窗口中。(默认情况目标控制台程序和CDB或NTSD共享相同的窗口。)
这相当于-d -g -G -o -pd -p -1。查看使用NTSD调试CSRSS获得详细说明。
-aExtension
设置默认的扩展DLL。默认值为userexts。在”a”之后不能加入空格,并且不能包含.dll 扩展名。详细信息和设置该选项的其他方法,查看加载调试器扩展DLL
-bonc
如果指定了该选项,调试器会在会话开始之后尽快中断目标。这在连接到可能不能正确中断到目标的调试服务器时特别有用。
-c “command
指定启动时运行的初始调试器命令。该命令必须用引号括起来。多条命令可以使用分号来分隔。(如果命令列表很长,将它们写入一个脚本文件并使用-c选项和$<, $><, $><, $$>< (Run Script File)命令可能会方便一些。)如果正在启动调试客户端,该命令必须由调试服务器使用。客户端指定的类似.lsrcpath 这样的命令是不能使用的。
-cf “filename
指定脚本文件的路径和名字。该脚本在调试器启动后会尽快被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果未使用-cf选项,当前目录下的 ntsd.ini会被作为该脚本文件。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件
-cfr “filename
指定脚本文件的路径和名字。该脚本在调试器启动后和每次调试目标被重起时会被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件
-clines lines
设置进行远程调试时可访问的历史命令的近似行数。详细信息和改变该数字的其他方法,查看使用调试器命令
-d
将调试器的控制传递给内核调试器。如果调试CSRSS,即使没有指定-d,控制重定向总是被激活的。(远程调试时不能使用该选项 — 使用-ddefer来替代。) 查看从内核调试器控制用户模式调试器获取详细信息。该选项不能和-ddefer-noio联合使用。
-ddefer
将该调试器的控制传递给内核调试器,除非调试客户端没有连接上来。(这是可以在调试服务器使用的-d选项的变种。)查看从内核调试器控制用户模式调试器获取详细信息。该选项不能和-d-noio联合使用。
-e Event
通知调试器指定的事件发生。该选项仅在编程启动调试器时使用。
-ee {masm|c++}
设置默认的表达式求值器。如果指定masm,则使用MASM表达式语法。如果指定C++,则使用C++语法。如果省略-ee选项,默认使用MASM表达式语法。查看表达式求值获取详细信息。
-failinc
指示调试器忽略任何可疑的符号。调试用户模式或内核模式minidump文件时,该选项也可以避免调试器加载任何映像不能被映射的模块的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS
-g
忽略目标应用程序中的初始断点。该选项使得目标程序在启动后或者CDB附加之后继续运行,除非设置了其他断点。查看初始断点获取详细信息。
-G
忽略进程终止时的最终断点。默认情况下,CDB会在进程结束时中断下来。该选项使得CDB在目标终止时直接退出。
-hd
(Microsoft Windows XP和之后的系统) 指定使用调试堆。查看创建的进程的行为获取详细信息。
-i ImagePath
指定产生错误的可执行文件的位置。如果该路径包含空格,需要用引号括起来。详细信息和改变该路径的其他方法,查看可执行映像路径
-iae
将CDB安装为即时调试器。详细信息,查看启用即时调试。如果操作成功,不会显示信息;如果失败会显示一条错误信息。-iae 参数不能和其他参数一起使用。该命令并不实际启动CDB。
-iaec KeyString
将CDB安装为即时调试器。KeyString 的内容将加入到AeDebug 注册表键的末尾。如果KeyString 包含空格,必须用引号括起来。详细信息,查看启用即时调试。如果操作成功,不会显示信息;如果失败会显示一条错误信息。-iaec不能和其他参数一起使用。该命令并不实际启动CDB。
-lines
启用源码调试。如果忽略该选项,在进行源码调试之前必须执行.lines (Toggle Source Line Support)命令。控制该选项的其他方式,查看SYMOPT_LOAD_LINES
-log{o|a} LogFile
将日志记录到日志文件中。如果指定文件已存在,使用-logo 时会被覆盖,使用-loga 时会将新内容添加到后面。更多信息,查看使用日志文件
-myob
如果和dbghelp.dll 版本不匹配,调试器仍然继续运行。(没有-myob开关时,这会产生一个致命错误。)
-n
详细符号加载:启用符号处理器的详细输出。关于控制该选项的其他方法,查看SYMOPT_DEBUG
-noinh
阻止调试器创建的进程继承调试器的句柄。关于控制该选项的其他方法,查看创建新进程(用户模式)
-noio
阻止调试服务器被用于输入输出。只允许来自调试客户端的输入(加上任何用-c 命令行选项指定的初始命令或命令脚本)。所有输出都会被重定向到调试客户端。 如果使用NTSD作为服务器,不会创建任何控制台窗口。详细信息,查看激活调试服务器。该选项不能和-d-ddefer选项联合使用。
-noshell
禁止任何.shell 命令。这种阻止只要调试器还在运行就会持续,即使开始了新的调试会话。详细信息和禁用.shell 命令的其它方法,查看使用Shell命令
-o
调试所有由目标进程创建的进程(子进程)。默认情况下,调试的目标进程创建的子进程是正常运行的。控制该选项的其他方法,查看创建新进程(用户模式)
-p PID
指定要调试进程的十进制进程ID。这用于调试已运行的进程。详细信息,查看附加到运行中的进程(用户模式)
-pb
(Windows XP和之后的系统) 在附加到目标进程时,阻止调试器要求初始断点。这在程序已经挂起或者不想在目标中创建中断线程(break-in thread)时有用。查看附加到运行中的进程(用户模式)
-pd
(Windows XP和之后的系统) 指定在结束调试会话时目标程序不会被终止。查看结束调试会话获取详细信息。
-pe
(Windows XP和之后的系统) 指示目标程序已经在被调试了。查看重新附加到目标程序获取详细信息。
-pn Name
指定被调试进程的名字。(该名字必须是唯一的。)这用来调试一个已经在运行的进程。详细信息,查看附加到运行中的进程(用户模式)
-pr
(Windows XP和之后的系统) 是的调试器在附加到目标进程时让它运行。这在程序已经被挂起并且想恢复它的执行时有用。查附加到运行中的进程(用户模式)
-psn ServiceName
指示包含要调试的进程的服务名。这在进程已经运行的情况下使用。详细信息查看附加到运行中的进程(用户模式)
-pt Seconds
指定中断超时时间,以秒为单位。默认为30。查看控制目标获取详细信息。
-pv
指定调试器应该以无侵入的方式附加到目标进程。详细信息,查看非侵入式调试(用户模式)
-QR Server
列出指定网络服务器上运行的所有调试服务器。双反斜杠(\\)是可选的。查看搜索调试服务器获取详细信息。-QR 参数不能和其他参数一起使用。该命令并不实际启动CDB。
-r BreakErrorLevel
指定将造成目标中断到调试器的错误等级。这是等于0、1、2或3的一个十进制数字。可能的值如下:

常数 含义
0 NONE 任何错误都不中断
1 ERROR 在ERROR级别的调试事件时中断
2 MINORERROR 在MINORERROR和ERROR级别的调试事件时中断
3 WARNING 在WARNING、 MINORERROR和ERROR级别的调试事件时中断

这些错误等级仅在Microsoft Windows调试版系统中有意义。默认值为1。

-robp
这使得CDB可以在只读的内存页面上设置断点。(默认情况下这种操作会失败。)
-s
禁止延迟符号加载。这会造成进程启动变慢。详细信息和控制该选项的其他方式,查看SYMOPT_DEFERRED_LOADS
-sdce
使得调试器在加载符号时显示File access error 对话框。详细信息和控制该选项的其他方法,查看SYMOPT_FAIL_CRITICAL_ERRORS
-ses
使得调试器对所有符号文件进行严格的匹配并忽略任何有问题的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS
-sflags 0xNumber
一次设置所有的符号处理器。Number 应该是以0x 开头的16进制数 — 不带0x 的10进制数也可以使用,但是由于符号选项是二进制标志,所以推荐使用16进制。该选项应该小心使用,因为它会覆盖所有默认的符号处理器。详细信息,查看设置符号选项
-sicv
使得符号处理器忽略CV记录。详细信息和控制该选项的其他方法,查看SYMOPT_IGNORE_CVREC
-sins
使得调试器忽略环境变量中的符号路径和可执行映像路径。详细信息查看SYMOPT_IGNORE_NT_SYMPATH
-snc
使得调试器关闭C++转换。详细信息和控制该选项的其他方法,查看SYMOPT_NO_CPP
-snul
禁止为有问题的名字自动加载符号。详细信息和控制该选项的其他方法,查看SYMOPT_NO_UNQUALIFIED_LOADS
-srcpath SourcePath
指定源文件搜索路径。用分号(;)分隔多个路径。如果路径包含空格,需要用引号括起来。详细信息和其他改变该路径的方法,查看源码路径
-sup
使得符号处理器每次搜索符号时都搜索公有符号表。详细信息和控制该选项的其他方法,查看SYMOPT_AUTO_PUBLICS
-t PrintErrorLevel
指定造成调试器显示错误信息的错误级别。这是一个等于0、1、2或者3的10进制数字。可能的值如下:

常数 含义
0 NONE 不显示任何错误
1 ERROR 显示ERROR级别的调试事件
2 MINORERROR 显示MINORERROR和ERROR级别的调试事件
3 WARNING 显示WARNING、MINORERROR和ERROR的调试事件

这些错误级别仅在Microsoft Windows调试版系统中有意义。默认值为1。

-v
启用调试器的详细输出。
-vf[:Flags]
使得目标进程在应用程序验证器(Application Verifier)下运行。 如果指定了Flags,这些标志会被传递给应用程序验证器。如果省略冒号和Flags,传递给应用程序验证器的标志值为0。详细信息,查看应用程序验证器
-w
指定调试一个在另一个VDM 中的16位程序。
-wake PID
使得进程ID由PID指定的用户模式调试器结束睡眠模式。该命令必须在睡眠模式时在目标机上执行。查看从内核调试器控制用户模式调试器获取详细信息。-wake参数不能和其他参数一起使用。该命令不会实际启动CDB。
-x{e|d|n|i} Exception
控制调试器在指定事件发生时的行为。Exception 可以是一个错误码或者事件代码。可以指定该选项数次来控制不同的事件。查看控制异常和事件获取详细信息和其他设置该选项的方法。
-x
禁止发生访问违例异常时的第一次中断机会。第二次访问违例的处理机会将中断到调试器。这和-xd av作用相同。
-y SymbolPath
指定符号搜索路径。使用分号(;)分隔多个路径。如果该路径包含空格,应该使用引号括起来。详细信息和其他修改这个路径的方法,查看符号路径
-z DumpFile
指定要调试的崩溃转储文件名。如果路径和名字包含空格,必须使用引号括起来。可以通过包含多个-z选项,每个后跟不同的DumpFile值来一次打开几个dump文件。详细信息,查看使用CDB分析用户模式Dump文件
-zp PageFile
指定被修改过的页面文件的名字。这在调试dump文件并想使用.pagein (Page In Memory)命令时很有用。-zp 不能使用标准的Windows页面文件 — 只有特殊修改过的页面文件可以使用。
executable
指定可执行进程的命令行。这用于创建一个新进程并调试它。它应该作为命令行的最后一项。所有在可执行文件名之后的文本都被作为参数字符串传递给可执行文件。详细信息,查看创建新进程(用户模式)
-?
显示命令行帮助文本。通过Start | Run 或命令提示符窗口启动调试器时,可以在目标程序名后面指定它的参数。例如:

cdb myexe arg1 arg2

码字很辛苦,转载请注明来自人生在世《Debugging Tools for Windows CDB命令行》

评论