.NET Framework 命令行调试器 (MDbg.exe)

.NET Framework 命令行调试器可以帮助工具供应商和应用程序开发人员查找并修复面向 .NET Framework 公共语言运行库的程序中的 Bug。此工具使用运行时调试 API 提供调试服务。在 .NET Framework SDK 中以示例应用程序的形式提供了 MDbg.exe 的源代码。开发人员可以检查此代码以了解如何使用调试服务。目前,只能使用 MDbg.exe 调试托管代码;不支持调试非托管代码。

MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]

命令

命令 说明

ap[rocess] [number]

切换到另一个调试的进程或打印可用进程。number 不是真正的 PID,而是一个从 0 开始索引的列表。

a[ttach] [pid]

附加到进程或打印可用进程。

b[reak] [ClassName.Method | FileName:LineNo]

在指定方法处设置断点。按顺序对各个模块进行扫描。break FileName:LineNo 用于在源代码中的某个位置设置断点;break ~number 用于在当前使用 x 命令显示的符号处设置断点;break module!ClassName.Method+IlOffset 用于在完全限定位置设置断点。

ca[tch] [exceptionType]

让调试器在遇到所有异常时都中断,而不仅是在遇到未处理的异常时中断。

conf[ig] [option value]

显示所有可配置选项,并显示在不提供任何可选值的情况下如何调用选项。如果指定了选项,请将 value 设置为当前选项。

当前可用选项有:

extpath:设置路径,使用 load 命令时在该路径中搜索扩展。

extpath+:向现有路径中添加路径,可以从这些现有路径加载扩展。

del[ete]

删除断点。

de[tach]

与调试的进程分离。

d[own] [frames]

下移活动堆栈帧。

echo

向控制台回显消息。

ex[it] [exitcode]

退出 MDbg.exe 外壳程序,可以选择指定进程退出代码。

fo[reach] [OtherCommand]

对所有线程执行命令。OtherCommand 是对一个线程执行的有效命令;foreach OtherCommand 则对所有线程执行同一命令。

f[unceval] [-ad Num] functionName [args ... ]

对当前活动线程进行函数求值,其中,要求值的函数为 functionName。函数名必须完全限定,包括命名空间。

-ad 选项指定用于解析函数的应用程序域。如果未指定 -ad 选项,则用于解析的应用程序域默认为用于函数求值的线程所在的应用程序域。

如果要进行求值的函数不是静态的,则传入的第一个参数应为 this 指针。在所有应用程序域中搜索函数求值所需的参数。

若要从应用程序域中请求值,请在变量前使用模块名和应用程序域名作为前缀。例如 funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef

此命令在应用程序域 0 中对函数 System.Object.ToString 进行求值。由于 ToString 方法为实例函数,因此,第一个参数必须为 this 指针。

g[o]

让程序继续执行,直至遇到断点、程序退出代码或导致程序停止的事件(例如,未处理的异常)。

h[elp] [command]

或者

? [command]

显示所有命令的说明或对指定命令的详细说明。

ig[nore] [event]

让调试器仅在遇到未处理的异常时停止。

int[ercept] FrameNumber

将调试器回滚到指定的帧号码。

如果调试器遇到异常,使用此命令可以将调试器回滚到指定的帧号码。可以使用 set 命令更改程序状态,然后使用 go 命令继续。

k[ill]

停止活动进程。

l[ist] [modules|appdomains|assemblies]

显示已加载的模块、应用程序域或程序集。

lo[ad] assemblyName

按以下方式加载扩展:加载指定的程序集,然后尝试从 Microsoft.Tools.Mdbg.Extension.Extension 类型运行静态方法 LoadExtension

mo[de] [option on/off]

设置不同的调试器选项。option 参数应为双字母对。

newo[bj] typeName [arguments...]

创建 typeName 类型的新对象。

n[ext]

运行代码并移动到下一行(即使下一行包含多个函数调用)。

o[ut]

移动到当前函数的末尾。

pa[th] [pathName]

如果二进制文件中的位置不可用,则在指定路径中搜索源文件。

p[rint] [var] | [-d]

打印相应范围内的所有变量 (print),打印指定变量 (print var),或者打印调试器变量 (print -d)。

pro[cessenum]

显示活动进程。

q[uit] [exitcode]

退出 MDbg.exe 外壳程序,可以选择指定进程退出代码。

re[sume] [*|[~]threadNumber]

继续当前线程或 threadNumber 参数指定的线程。

如果指定 threadNumber 参数为 *,或者线程号以 ~ 开始,则该命令将应用于所有线程,threadNumber 指定的线程除外。

无法继续未挂起的线程。

r[un] [-d(ebug) | -o(ptimize) | -enc] [[path_to_exe] [args_to_exe]]

停止当前进程(如果存在)并启动一个新进程。如果未提供可执行参数,此命令将运行上次使用 run 命令执行的程序。如果提供了可执行参数,将使用提供的参数(可选)运行指定的程序。

如果忽略类加载、模块加载和线程启动事件(默认情况下如此),程序将在遇到主线程的第一条可执行指令时停止。

使用以下三个有效标志中的任何一个,可以强制调试器对代码进行实时 (JIT) 编译

-d(ebug) 默认用于 MDbg.exe,该标志禁用优化。

-o(ptimize) 默认用于调试器的外部。该标志强制代码的运行方式更接近于调试器外部的运行方式,但也使调试工作更加困难。

-enc 启用“编辑并继续”功能,但会招致性能问题。

Set variable=value

更改任意的范围内变量的值。

您还可以创建自己的调试器变量,然后在自己的应用程序中将引用值赋给这些变量。这些值作为原始值的句柄,即使原始值超出范围也不例外。所有调试器变量都必须以 $ 开头(例如 $var)。使用 set $var= 命令将这些句柄设置为空,便可以清除这些句柄。

Setip [-il] number

将文件中当前的指令指针设置到指定位置。如果指定了 -il 选项,则 number 表示方法中的中间语言偏移量;否则 number 表示源代码中的行号。

sh[ow] [lines]

指定要显示的行数。

s[tep]

开始执行当前行的下一个函数;如果没有要单步执行的函数,则移动到下一行。

su[spend] [*|[~]threadNumber]

挂起当前线程或 threadNumber 参数指定的线程。

如果将 threadNumber 指定为 *,则该命令应用于所有线程。如果线程号以 ~ 开头,则该命令应用于所有线程,threadNumber 指定的线程除外。使用 gostep 命令运行进程时,不会运行挂起的线程。如果进程中没有未挂起的线程,即使您发出 go 命令,该进程也不会继续。在这种情况下,可以发出 Ctrl-C 命令强行进入该进程。

sy[mbol] commandName [commandValue]

指定下列命令之一:

symbol path ["value"] - 显示或设置当前符号路径。

symbol addpath "value" - 添加到当前符号路径。

symbol reload ["module"] - 重新加载所有符号或指定模块的符号。

symbol list [module] - 显示当前为所有模块或指定模块加载的符号。

t[hread] [newThread][-nick name]

name 作为昵称分配给当前的活动线程。可以使用昵称来代替线程名称。昵称不能为数字。如果已经为当前线程分配了昵称,则使用新的昵称来替换旧的昵称。如果新的昵称为 "",则删除当前线程的昵称,并且不会为该线程分配新的昵称。

thread newThread - 将活动线程设置为 newThreadnewThread 可以是线程的昵称,也可以是线程号。

thread - 显示当前进程中的所有托管线程。

线程通常以线程号标识;但是,如果为线程分配了昵称,则显示昵称。

u[p]

上移活动堆栈帧。

uwgc[handle] [var] | [address]

打印句柄所跟踪的变量。可以按名称或地址来指定句柄。

when

显示当前处于活动状态的 when 语句。

when delete all | num [num [num …]] - 删除 num 指定的 when 语句;如果指定 all,则删除所有 when 语句。

when stopReason [specific_condition] do cmd [cmd [cmd …] ] - stopReason 参数可以为:

StepComplete, ProcessExited, ThreadCreated, BreakpointHit, ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, EvalComplete, EvalException, RemapOpportunityReached, NativeStop.

specific_condition 可以为:

number - 对于 ThreadCreatedBreakpointHit,只有当具有相同值的线程 ID/断点号引起停止时才会触发操作。

[!]name - 对于 ModuleLoadedClassLoadedAssemblyLoadedAssemblyUnloadedExceptionThrownUnhandledExceptionThrown,只有当名称与 stopReason 的名称匹配时才会触发操作。

对于其他 stopReason 的值,specific_condition 必须为空。

w[here] [-v] [-c depth] [threadID]

显示有关堆栈帧的调试信息。

-v 选项为显示的每个堆栈帧提供详细信息。

为 depth 指定一个数字可以限制显示的帧数。使用 all 命令可以显示所有帧。默认值为 100。

如果指定 threadID 参数,则可以控制哪个线程与堆栈关联。默认只与当前线程关联。使用 all 命令可以获取所有线程。

x [-c numSymbols] [module[!pattern]]

显示与模块的 pattern 匹配的函数。

如果指定了 numSymbols,则输出将局限于指定的数目。如果未指定 !regex,则显示所有函数。如果未提供 module,则显示加载的所有模块。符号 (~#) 可用于通过 break 命令来设置断点。

备注

MDbg.exe 命令区分大小写。

备注

请使用编译器特定的标志(这些标志将使编译器生成调试符号)来编译要调试的应用程序。有关这些标志的更多信息,请参见编译器的文档。还可以调试经过优化的应用程序,但将丢失一些调试信息。例如,许多局部变量将无法看到,并且源代码行也会变得不准确。

编译完应用程序之后,在命令提示符下键入 MDbg 即可启动调试会话,如以下示例所示:

D:\Program Files\FrameworkSDK\Bin>MDbg
MDbg (Managed debugger) v2.0.50215.44 (beta2.050215-4400) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

mdbg 提示符表示您处于调试器中。

进入调试器后,使用命令和合适的参数调用所需的功能。

示例

请参见

参考

.NET Framework 工具
SDK 命令提示