运行库调试器 (Cordbg.exe)
运行库调试器帮助工具供应商和应用程序开发人员查找并修复以 .NET Framework 公共语言运行库为目标的程序中的 bug。此工具使用运行时调试 API 提供调试服务。Cordbg.exe 的源代码是作为示例应用程序交付的。开发人员可以检查此代码以了解如何使用调试服务。目前,只能使用 Cordbg.exe 调试托管代码;不支持调试非托管代码。
使用下面的第一行语法启动 Cordbg.exe 会话。在 Cordbg.exe 会话内在 (cordbg)
提示处使用第二行语法。
cordbg [ProgramName[Program arguments]][optional arguments ]
command [command arguments]
参数
命令 | 说明 | ||||||
---|---|---|---|---|---|---|---|
ap[pdomainenum] [option] |
枚举当前进程中的所有应用程序域、程序集和模块。如果没有指定 option 参数,命令将列出当前进程中的所有应用程序域、程序集和模块。分离或附加后,必须指定 go 命令以继续执行。 option 参数可以是下列之一:
|
||||||
as[sociatesource] {s|b breakpoint id} filename |
将给定文件名与当前堆栈帧指针(选项 s)或指定的断点(选项 b)关联。 |
||||||
a[ttach] pid |
将调试器附加到正在运行的进程。Cordbg.exe 取消当前正在调试的程序(如果有),并尝试附加到 pid 参数指定的进程。进程标识号 pid 可以是十进制格式或十六进制格式。 |
||||||
b[reak] [[file:] line number] | [[ class::] function [:offset]] |
设置或显示断点。如果没有指定任何参数,此工具将显示当前断点列表;否则它在指定位置设置断点。可以在当前源文件中的行号处、完全限定源文件的行号处或者由类或可选偏移量限定的方法中设置断点。 断点在一个会话中的各运行间保持。可以按使用 break 的同样方式使用 stop 命令。 如果无法将指定断点位置绑定到代码,则 Cordbg.exe 将断点显示为“未绑定”。未绑定断点意味着尚未加载断点位置的基础代码。出现这种情况可能由于若干正当的原因,如拼错文件名或类名(它们是区分大小写的)。同样,如果在运行应用程序前设置断点,则将不绑定这些断点。断点在实际代码加载后成为绑定的。调试器在加载模块时尝试自动重新绑定每个未绑定的断点。 |
||||||
ca[tch] [event] |
显示事件类型的列表,或使指定事件类型停止调试器。如果没有指定参数,此工具将显示事件类型的列表,其中停止调试器的事件类型标记为“on”,被忽略的事件类型标记为“off”。如果指定了参数,则调试器在指定类型的事件出现时停止。默认情况下,调试器只在遇到未处理的异常事件(即另一个可能的异常)时停止。停止调试器的事件类型在一个会话中的各运行间保持。若要使调试器忽略特定类型的事件,请使用 ignore 命令。 事件参数可以是下列之一:
|
||||||
conn[ect] machine_name port |
用于智能设备项目。 连接到运行 .NET Compact Framework 应用程序的远程设备。
|
||||||
cont [count] |
继续程序。如果没有指定参数,程序将继续一次。如果指定了参数,则程序继续指定的次数。此命令对于在类加载事件、异常或断点停止调试器时继续程序很有用。可以按使用 cont 的同样方式使用 go 命令。 |
||||||
del[ete] [breakpoint id, ...] |
删除断点。如果没有指定任何参数,此工具将删除所有当前断点。如果指定了一个或多个 breakpoint id 参数,则工具删除指定的断点。通过使用 break 或 stop 命令可获取断点标识符。可以按使用 delete 的同样方式使用 remove 命令。 |
||||||
de[tach] |
从当前进程中分离调试器。此进程自动继续运行,就像没有调试器附加到它一样。 |
||||||
dis[assemble] [0xaddress][{+|-} delta] [line count] |
如果指定了当前指令指针或 address,则显示它们的本机反汇编指令。 默认的显示指令数为五个。如果指定了 line count 参数,此工具将显示当前指令指针或地址之前和之后的指定数目的额外指令。最后使用的 line count 为当前会话的默认值。如果指定了增量,则指定的数目将添加到当前指令指针或指定地址以开始反汇编。 |
||||||
d[own] [count] |
出于检查的目的,将堆栈帧指针沿堆栈向下朝当前帧所调用的帧移动。如果没有指定参数,堆栈帧指针将下移一帧。如果指定了参数,堆栈帧指针将下移指定的帧数。如果源级别信息可用,则此工具显示帧的源行。此命令常常与 up 命令联合使用。 |
||||||
du[mp] address [count] |
转储内存块,其输出根据调试器模式(请参见 mode)的不同,可以是十六进制格式或十进制格式。address 参数是内存块的地址。count 参数是要转储的字节数。 |
||||||
ex[it] |
停止当前进程并退出调试器。可以按使用 exit 的同样方式使用 quit 命令。 |
||||||
f[unceval] [class::] function [ arg0 arg1 ...argn] |
计算当前线程上的指定函数。此工具将新对象存储在变量 $result 中,并可将它用于后面的计算。有效参数被限制为其他变量、四字节整数和常数 Null、True 及 False。 备注 对于成员函数,第一个参数应为成员函数所属的类或派生类的对象。 |
||||||
g[o] [count] |
请参见 cont。 |
||||||
h[elp] [command ...] |
显示指定命令的说明。如果没有指定任何参数,Cordbg.exe 将显示调试器命令列表。可以按使用 help 的同样方式使用 ? 命令。 |
||||||
ig[nore] [event] |
显示事件类型的列表或使调试器忽略指定的事件类型。如果没有指定 event 参数,此工具将显示事件类型的列表,其中被忽略的事件类型标记为“off”,停止调试器的事件类型标记为“on”。如果指定了参数,则此工具忽略指定类型的事件。若要设置停止调试器的事件类型,请使用 catch 命令。 event 参数可以是下列事件类型之一:
|
||||||
i[n] [count] |
请参见 step。 |
||||||
k[ill] |
停止当前进程。调试器保持活动以处理进一步的命令。 |
||||||
l[ist] option |
显示已加载的模块、类或全局函数的列表。 option 参数可以是下列之一:
|
||||||
m[ode] [[mode name {0|1} ] |
设置并显示各种调试器功能的调试器模式。若要设置一个值,请指定 mode name,并指定 1 表示“on”或 0 表示“off”。如果没有指定参数,此工具将显示当前模式设置的列表。在 Cordbg.exe 的不同运行期间,这些模式将保留在 Windows 注册表中。有关更多信息,请参见调试器模式参数表。 |
||||||
newo[bj] class |
使用当前线程创建新对象。此工具将新对象存储在变量 $result 中,并可将它用于后面的计算。 |
||||||
newobjnc class |
使用当前线程创建一个新对象,而不运行此对象的构造函数。新对象初始化为零。此工具将新对象存储在变量 $result 中,并可将它用于后面的计算。 |
||||||
news[tr] string |
使用当前线程创建新字符串。此工具将新对象存储在变量 $result 中,并可将它用于后面的计算。 |
||||||
n[ext] [count] |
单步执行程序到下一源行,并逐过程执行函数调用。如果没有指定参数,此工具将单步执行一个源行。如果指定了参数,则此工具单步执行指定数目的源行。可以按使用 next 的同样方式使用 so 命令。 |
||||||
ns[ingle] [count] |
一个或多个指令地单步执行程序,并跳过函数调用。如果没有指定参数,此工具将单步执行一条指令。如果指定了 count 参数,则此工具单步执行指定数目的指令。 |
||||||
o[ut] [count] |
使程序跳出当前函数。如果没有指定参数,此工具将对当前函数执行一次跳出操作。如果指定了参数,则此工具执行指定次数的跳出操作。 |
||||||
pa[th] [new path] |
显示或设置用于搜索源文件和调试符号的路径。如果没有指定参数,此工具将显示当前路径。如果指定了 new path 参数,则此参数将成为搜索源文件和调试符号的新路径。此路径在会话间保持在 Windows 注册表中。 |
||||||
p[rint] [variable name] |
显示一个或多个局部变量及其值。如果没有指定参数,此工具将显示所有局部变量及其值。如果指定了参数,则此工具只显示指定局部变量的值。有关详细信息,请参见“示例”节中的使用 print 命令。 |
||||||
pro[cessenum] |
枚举所有的托管进程和每个进程中的应用程序域。 |
||||||
q[uit] |
请参见 exit。 |
||||||
ref[reshsource] [source file] |
重新加载给定源文件的源代码。将要重新加载的源文件必须是当前正在执行的程序的一部分。用 path 命令设置源文件路径后,可以使用 refreshsource 命令调入缺少的源代码。 |
||||||
regd[efault] [force] |
将默认实时 (JIT) 调试器设置为 Cordbg.exe。如果已注册其他调试器,则此命令无效。使用 force 参数改写已注册的 JIT 调试器。 |
||||||
reg[isters] |
显示当前线程的寄存器内容。 |
||||||
rem[ove] [breakpoint id, ...] |
请参见 delete。 |
||||||
re[sume] [~] [tid] |
调试器继续时继续由 tid 参数指定的线程。如果使用 ~ 语法,则工具继续除指定线程以外的所有线程。如果没有指定参数,则命令无效。 |
||||||
r[un] [executable [args]] |
取消当前进程(如果有)并启动一个新进程。如果没有指定 executable 参数,此命令将运行以前用 run 命令执行的程序。如果指定了 executable 参数,则此工具使用可能提供的 args 运行指定程序。如果 Cordbg.exe 忽略类加载、模块加载和线程启动事件(默认情况下如此),程序将在遇到主线程的第一条可执行指令时停止。 |
||||||
set variable value |
将指定 variable 的值设置为指定 value。此值可以是文本或其他变量。有关详细信息,请参见“示例”节中的使用 set 命令。 |
||||||
setip line number |
设置执行到指定 line number 的下一条语句。 |
||||||
sh[ow] [count] |
显示源代码行。如果没有指定参数,此工具将显示当前源代码行之前和之后的五个源代码行。如果指定了参数,此工具将显示当前行之前和之后指定数目的行。最后指定的 count 成为当前会话的默认值。 |
||||||
si [<count>] |
请参见 step。 |
||||||
so [<count>] |
请参见 next。 |
||||||
ss[ingle] [count] |
一个或多个指令地单步执行程序,进入并单步执行函数调用。如果没有指定参数,此工具仅进入并单步执行一条指令。如果指定了参数,此工具将执行指定数目的步骤。 |
||||||
s[tep] [count] |
单步执行程序到下一源行,进入并单步执行函数调用。如果没有指定参数,程序将单步执行到下一行。如果指定了参数,程序将单步执行指定数目的行。可以按使用 step 的同样方式使用 si 命令或 in 命令。 |
||||||
stop [[file:] line number] | [[class::] function[:offset]] | [=0xaddress] |
请参见 break。 |
||||||
su[spend] [~] [tid] |
调试器继续时挂起 tid 参数指定的线程。如果使用 ~ 语法,此工具将挂起除指定线程外的所有其他线程。如果没有指定参数,则命令无效。 |
||||||
t[hreads] [tid] |
显示线程列表或设置当前线程。如果没有指定参数,此工具将显示所有仍保持连接和已运行托管代码的线程的列表。如果指定了参数,此工具将当前线程设置为指定线程。 |
||||||
up [count] |
出于检查目的,将堆栈帧指针沿堆栈向上朝当前帧所调用的帧移动。如果没有指定参数,堆栈帧指针将上移一帧。如果指定了参数,堆栈帧指针将上移指定数目的堆栈帧。如果源级别信息可用,则此工具显示帧的源行。 |
||||||
w[here] [count] |
显示当前线程的堆栈跟踪。如果没有指定参数,此工具将显示完整的堆栈跟踪。如果指定了参数,则此工具显示指定数目的堆栈帧。 |
||||||
wr[itememory] address count byte, ... |
将指定字节写入目标进程。address 参数指定将字节写入的位置。count 参数指定要写入的字节数。byte 参数指定要写入进程的内容。如果列表中的字节数小于 count 参数,则此工具包装字节列表并再次复制它。如果列表中的字节数大于 count 参数,此工具将忽略额外的字节。 |
||||||
wt |
按本机指令单步执行应用程序,从当前指令开始并随执行的进行显示调用树。此工具利用调用跟踪显示在每个函数中执行的本机指令数。当此工具到达最初在其中执行命令的函数的返回指令时,跟踪停止。在跟踪的最后,此工具显示总共执行的指令数。此命令模仿 NT 符号调试器 wt 命令,并可用于基本性能分析。此工具目前只对托管代码计数。 |
||||||
x modulename ! string_to_look_for |
显示指定模块中与 string_to_look_for 参数指定的模式匹配的符号。可以在 string_to_look_for 参数中使用星号 (*) 字符以指示此工具匹配任何内容。此工具忽略 * 字符后的任何字符。 |
||||||
? [command ...] |
请参见 help。 |
||||||
> filename |
将所有已执行的命令写入指定 filename。如果没有指定 filename,则此命令停止将命令写入文件。 |
||||||
< filename |
从指定 filename 中读取并执行命令。 |
备注
Cordbg.exe 命令区分大小写。另外,有几个命令有同义词,这意味着可以用这些命令中的任何一个产生相同的结果。例如,可以使用 break 或 stop 命令设置断点。
模式参数
可使用使模式唯一所需的最少数量的字符来指定模式参数。例如,“mode m 1”等效于“mode moduleloads 1”。
参数 | 说明 |
---|---|
AppDomainLoads |
显示应用程序域和程序集加载事件。 |
ClassLoads |
显示类加载事件。 |
DumpMemoryInBytes |
将内存内容显示为字节或 DWORDS。 |
EmbededCLR |
将调试器设置为在智能设备上运行的目标 .NET Compact Framework 应用程序。若要控制此设置,请指定 1 为“on”或 0 为“off”。 |
EnhanceDiag |
显示增强诊断信息。 |
HexDisplay |
以十六进制或十进制格式显示数字。 |
ILNatPrint |
用 Microsoft 中间语言 (MSIL) 或本机相关语言或者两者来显示偏移量。 |
ISAll |
逐句通过所有截听器。 |
ISClinit |
逐句通过类初始值设定项。 |
ISExceptF |
逐句通过异常筛选器。 |
ISInt |
逐句通过用户截听器。 |
ISPolicy |
逐句通过上下文策略。 |
ISSec |
逐句通过安全截听器。 |
JitOptimizations |
指定 JIT 编译是否生成更易于调试的代码。 |
LoggingMessages |
显示托管代码日志消息。 |
ModuleLoads |
显示模块加载事件。 |
SeparateConsole |
指定正在调试的进程是否获取自己的控制台。 |
ShowArgs |
显示堆栈跟踪中的方法参数。 |
ShowModules |
显示堆栈跟踪中的模块名。 |
ShowStaticsOnPrint |
显示对象的静态字段。 |
ShowSuperClassOnPrint |
显示对象的基类内容。 |
USAll |
逐句通过所有未映射的停止位置。 |
USEpi |
逐句通过方法结束。 |
USPro |
逐句通过方法起始。 |
USUnmanaged |
逐句通过非托管代码。 |
备注
应该使用编译器特定的标志(这些标志将使编译器生成调试符号)来编译要调试的应用程序。有关这些标志的更多信息,请参见编译器的文档。还可以调试经过优化的应用程序,但将丢失一些调试信息。例如,许多局部变量将不可见,并且源代码行也会不准确。
如下例所示,编译应用程序后在命令提示处键入 cordbg 以启动调试会话。
D:\Program Files\FrameworkSDK\Bin>cordbg
Microsoft (R) Common Language Runtime Test Debugger Shell. Version 2000.14.2100.0, Copyright (c) Microsoft Corp. 1998-2000
(cordbg)
(cordbg)
提示符表示您处于调试器中。
进入调试器后,使用命令和合适的参数调用所需的功能。
当从命令行启动调试会话时,还可以提供要调试的应用程序名、程序参数和可选参数。Cordbg.exe 的可选参数与在 Cordbg.exe 中所使用的命令相同,但必须在它们的前面加上惊叹号 (!) 字符。在 ! 字符前加上反斜杠 (\) 可使 ! 字符用作字符串中的文本。在使用 x 命令时这是必不可少的。
如果命令的数值参数以前缀 0x 开头,则 Cordbg.exe 将假设此参数为十六进制格式。否则,假设参数为十进制格式。
Cordbg.exe 中的大多数命令都可以用星号 (*) 作为前缀,从而使该命令针对进程中的每个托管线程都执行一次。该命令在每个线程的上下文中执行。以星号为前缀的最有用的命令是 w[here] 命令。例如,*w 将显示每个托管线程的堆栈跟踪。
有关运行时的调试服务的更多信息,请参见“Enabling Profiling and Debugging”规范。另外,工具开发人员应参见 .NET Framework SDK 附带的“Tools Developers Guide”文件夹中的“Debug Overview and Debug Reference”规范。
示例
启动 Cordbg.exe 会话
下面的命令使用程序参数 a
和 2
以及下列可选命令,为应用程序 MyApplication.exe
启动一个 Cordbg.exe 会话:在 MyApplication.cs
中的第 42 行设置断点;使应用程序继续;显示 MyApplication.exe
中与字符串 'SomeString'
匹配的符号。
cordbg MyApplication.exe a 2 !b MyApplication.cs:42 !g !x MyApplication.exe\!SomeString
在 Cordbg.exe 会话内运行可执行文件
下面的命令从 Cordbg.exe 会话(在(cordbg)
提示符下)中输入,并使用程序参数 a
和 2
运行可执行文件 MyApplication.exe
。
run MyApplication.exe a 2
使用 print 命令
下列命令说明如何将点表示法与 print 命令一起使用以指定对象内的变量。
print obj.var1
print obj1.obj2.var1
如果一个类扩展了另一个类,则 print 命令同时显示指定类的字段和基类的字段。例如,如果 m1
类具有字段 a
、b
和 c
,而 m2
类扩展 m1
并具有字段 d
、e
和 f
,则 m2
的实例 myInstance
如下所示。
myInstance = <addr> <m2>
a = 1
b = 2
c = 3
m2::d = 4
m2::e = 5
m2::f = 6
通过在变量名的前面加上类名可以指定类静态变量,如下所示。
print MyClass::StaticVar1
print System::Boolean::True
数组索引必须是简单表达式。下列数组索引与 print 命令一起使用时有效。
print arr[1]
print arr[i]
print arr1[arr2[1]]
print md[1][5][myObject.a]
由于此数组索引不是一个简单表达式,因此下列数组索引在和 print 命令一起使用时无效。
print arr[i + 1]
print arr[i + 2]
使用 set 命令
使用 set 命令时,分配给指定变量的值可以是文本或其他变量。下列是 set 命令的有效用法。
set int1 0x2a
set float1 3.1415
set char1 'a'
set bool1 true
set obj1 0x12345678
set obj1 obj2
set obj1.m_length[obj1.m_height] obj3.m_length[2]