x (檢查符號)
x 命令會在符合指定模式的所有內容中顯示符號。
x [Options] Module!Symbol
x [Options] *
參數
選項 指定符號搜尋選項。 您可以使用下列一或多個選項:
/0
只顯示每個符號的位址。
/1
只顯示每個符號的名稱。
/2
只顯示每個符號的位址和名稱(不是數據類型)。
/D
使用 調試程式標記語言顯示輸出。
/t
如果已知數據類型,則顯示每個符號的數據類型。
/v
顯示每個符號的符號類型(本機、全域、參數、函式或未知)。 這個選項也會顯示每個符號的大小。 函式符號的大小是記憶體中的函式大小。 其他符號的大小是符號所代表之數據類型的大小。 大小一律以位元組為單位來測量,並以十六進位格式顯示。
/s 大小
只顯示大小等於 Size 值的符號,以位元組為單位。 函式符號的大小是記憶體中的函式大小。 其他符號的大小是符號所代表數據類型的大小。 無法判斷其大小一律會顯示的符號。 Size 必須是非零整數。
/q
以引號格式顯示符號名稱。
/p
當調試程序顯示函式名稱和其自變數時,省略左括號之前的空格。 如果您將函式名稱和自變數從 x 顯示器複製到另一個位置,這種顯示可能會更容易。
/f
顯示函式的數據大小。
/d
顯示數據的數據大小。
/一個
以遞增順序依位址排序顯示。
/一個
依位址排序顯示,依遞減順序排序。
/n
依名稱排序顯示,依遞增順序排序。
/N
依名稱排序顯示,依遞減順序排序。
/z
依大小排序顯示,以遞增順序排序。
/Z
依大小排序顯示,依遞減順序排序。
模組
指定要搜尋的模組。 此模組可以是.exe、.dll或.sys檔案。 模組 可以包含各種通配符和規範。 如需語法的詳細資訊,請參閱 字串通配符語法。
象徵
指定符號必須包含的模式。 符號 可以包含各種通配符和規範。 如需語法的詳細資訊,請參閱 字串通配符語法。
因為此模式會比對符號,因此比對不區分大小寫,而單一前置底線 (_) 代表任何前置底線數量。 您可以在 Symbol 內新增空格,以便指定包含空格的符號名稱(例如 “operator new” 或 “Template<A, B>”),而不使用通配符。
Environment
項目 | 說明 |
---|---|
模式 | 使用者模式、核心模式 |
目標 | 即時、損毀傾印 |
平台 | 全部 |
備註
下列命令會在 MyModule 中尋找包含字串 「spin」 的所有符號。
0:000> x mymodule!*spin*
下列命令會快速找出 MyModule 中的 “DownloadMinor” 和 “DownloadMajor” 符號。
0:000> x mymodule!downloadm??or
您也可以使用下列命令,在 MyModule 中顯示所有符號。
0:000> x mymodule!*
上述命令也會強制調試程式從 MyModule 重載符號資訊。 如果您想要以最少的顯示重載模組中的符號,請使用下列命令。
0:000> x mymodule!*start*
一些符號一律包含字串 「start」。 因此,上述命令一律會顯示一些輸出,以確認命令是否正常運作。 但上述命令可避免 x mymodule!*的顯示長度過長。
顯示會顯示每個符號的起始位址和完整符號名稱。 如果符號是函式名稱,顯示也會包含其自變數類型的清單。 如果符號是全域變數,則會顯示其目前值。
另外還有一個 x 命令的特殊案例。 若要顯示目前內容之所有局部變數的位址和名稱,請使用下列命令。
0:000> x *
注意 在大部分情況下,除非已載入私人符號,否則您無法存取局部變數。 如需這種情況的詳細資訊,請參閱 dbgerr005:需要私人符號。 若要顯示局部變數的值,請使用 dv (顯示局部變數) 命令。
下列範例說明 /0、 /1 和 /2 選項。
0:000:x86> x /0 MyApp!Add*
00b51410
00b513d0
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers
0:000:x86> x /2 MyApp!Add*
00b51410 MyApp!AddThreeIntegers
00b513d0 MyApp!AddTwoIntegers
如果您想要使用 x 命令的輸出做為 .foreach 命令的輸入,/0、/1 和 /2 選項很有用。
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
下列範例示範當用來篩選模組上的函式時,參數 /f notepad.exe。
0:000> x /f /v notepad!*main*
prv func 00000001`00003340 249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func 00000001`0000a7b0 1c notepad!WinMainCRTStartup$filt$0 (void)
prv func 00000001`0000a540 268 notepad!WinMainCRTStartup (void)
當您使用 /v 選項時,顯示的第一個數據行會顯示符號類型(local、global、parameter、function 或 unknown)。 第二個數據行是符號的位址。 第三個數據行是符號的大小,以位元組為單位。 第四個數據行會顯示模組名稱和符號名稱。 在某些情況下,此顯示後面接著等號 (=),然後是符號的數據類型。 也會顯示符號的來源(公用或完整符號資訊)。
kd> x /v nt!CmType*
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68 150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0 0 nt!CmTypeString = unsigned short *[]
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
在上述範例中,大小是以十六進位格式來指定,而數據類型則以十進位格式指定。 因此,在上述範例的最後一行中,數據類型是42個不帶正負號短整數指標的陣列。 此陣列的大小為42*4 = 168,而168會以十六進位格式顯示為 0xA8。
您可以使用 /sSize 選項,只顯示大小為位元組的符號是特定值。 例如,您可以將上述範例中的 命令限制為代表其大小為0xA8物件的符號。
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
使用數據類型
/t 選項會讓調試程序顯示每個符號數據類型的相關信息。 請注意,對於許多符號,即使沒有 /t 選項,也會顯示此資訊。 當您使用 /t 時,這類符號的數據類型資訊會顯示兩次。
0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>
0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>
x 命令會顯示類型的實例。
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
x 命令不會根據類型的名稱顯示任何專案。
0:001> x foo!MyClass
0:001>
若要使用類型名稱來顯示類型資訊,請考慮使用 dt (顯示類型),它會提供類型類型和實例的資訊:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
使用範本
您可以使用通配符搭配 x 命令來顯示範本類別,如此範例所示。
0:001> x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)
使用範本時,請考慮使用 dt (Display Type) 命令,因為 x 命令不會顯示個別的範本類別專案。
0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
+0x000 __VFN_table : Ptr64
+0x008 componentConfig_ : Ptr64 Common::ComponentConfig
+0x010 section_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
+0x038 key_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >