Share via


.NET Framework 命令列偵錯工具 (MDbg.exe)

更新:2007 年 11 月

.NET Framework 命令列偵錯工具可以協助工具廠商和應用程式開發人員尋找並修復以 .NET Framework Common Language Runtime 為目標之程式的錯誤。這個工具使用執行階段偵錯 API 來提供偵錯服務。MDbg.exe 的原始程式碼隨附為 Windows Software Development Kit (SDK) 的範例應用程式。開發人員可以測試該程式碼,以便學會如何使用偵錯服務。目前您只能使用 MDbg.exe 偵錯 Managed 程式碼;不支援偵錯 Unmanaged 程式碼。

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

命令

命令

說明

ap[rocess] [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]

將現用堆疊框架 (Stack Frame) 往下移。

echo

回應訊息至主控台。

ex[it] [exitcode]

結束 MDbg.exe Shell,可以選擇指定處理序結束代碼 (Exit Code)。

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 方法是執行個體 (Instance) 函式,第一個參數必須是 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 Shell,可以選擇指定處理序結束代碼。

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

繼續目前的執行緒,或由 threadNumber 參數指定的執行緒。

如果 threadNumber 參數指定為 *,或是如果執行緒編號以 ~ 開頭,則將此命令套用至所有執行緒,只有由 threadNumber 指定的執行緒除外。

繼續非暫止的執行緒沒有任何效用。

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

停止目前處理序 (如果有的話),並啟動新的處理序。如果沒有傳遞可執行的引數,這個命令會執行先前以 run 命令執行的程式。如果已提供可執行的引數,就會使用選擇性地提供之引數執行指定的程式。

如果略過類別載入、模組載入和執行緒啟動事件 (如預設情況),程式就會在主要執行緒之第一個可執行的指令上停止。

您可以強制執行偵錯工具,進行 Just-In-Time (JIT) 編譯,使用下列三個當中的

任何一個有效旗標:

-d(ebug) 是 MDbg.exe 的預設值,並停用最佳化。

-o(ptimize) 是供在偵錯工具之外使用的預設值。它會強制程式碼像在偵錯工具之外一樣執行,但同時也讓偵錯經驗更加困難。

-enc 會啟用「編輯後繼續」功能,但是會因而影響到效能。

Set variable=value

變更任何範圍內變數的值。

您也可以自行建立偵錯工具變數,並從您的應用程式之內指定參考值給變數。這些值是做為原始值的控制代碼,即使原始值超出範圍以外也無妨。所有偵錯工具變數都必須以 $ 開頭 (例如,$var)。透過使用下列命令,將控制代碼設定為 nothing,清除這些控制代碼:set $var=

Setip [-il] number

將檔案中目前的指令指標 (IP) 設定為指定的位置。如果指定了 -il 選項,number 就表示方法中的中繼語言 (Intermediate Language) 位移 (Offset)。否則 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 - 顯示目前處理序中所有 Managed 執行緒。

執行緒通常是以其執行緒編號識別,但是如果執行緒有指定的暱稱,則改為顯示暱稱。

u[p]

將現用堆疊框架 (Stack Frame) 往上移。

uwgc[handle] [var] | [address]

列印由控制代碼追蹤的變數。控制代碼可以用名稱或位址加以指定。

when

顯示目前使用中的 when 陳述式。

when delete all |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 - 針對 ThreadCreated 和 BreakpointHit,只在由執行緒 ID/中斷點編號,以相同的值停止時,才會觸發動作。

[!]name - 針對 ModuleLoaded、ClassLoaded、AssemblyLoaded、AssemblyUnloaded、ExceptionThrown 和 UnhandledExceptionThrown,只在名稱與 stopReason 的名稱相符時,才會觸發動作。

specific_condition 對其他 stopReason 的值必須是空白。

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,以啟動偵錯工作階段,如下列範例所示:

C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

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

mdbg 提示會指出您正在使用偵錯工具。

一旦您使用了偵錯工具,使用命令和適當的引數來叫用 (Invoke) 所需的功能。

請參閱

參考

.NET Framework 工具

SDK 命令提示字元