如果您的應用程式有 C 或 C++ 來源檔案,您可以在 來源模式中偵錯時更強大地使用調試程式。
不過,很多時候您無法執行原始碼偵錯。 您可能沒有應用程式的來源檔案。 您可能會對其他人的程式代碼進行偵錯。 您可能尚未使用完整的 .pdb 符號來建置可執行檔。 即使您可以對應用程式進行源代碼調試,您可能仍然需要追蹤您的應用程式所調用的 Microsoft Windows 例程,或用於載入應用程式的例程。
在這些情況下,您必須在組合語言模式中偵錯。 此外,元件模式有許多在來源偵錯中不存在的實用功能。 調試程式會自動顯示記憶體位置的內容,並在存取時註冊,並顯示程式計數器的位址。 此顯示可讓元件偵錯成為可搭配來源偵錯使用的寶貴工具。
反組譯碼
調試程式主要分析二進位可執行程序代碼。 調試程式會 反組譯 此程序代碼,而不是以原始格式顯示此程序代碼。 也就是說,調試程式會將程式代碼從計算機語言轉換成元件語言。
您可以透過數種不同的方式顯示結果代碼(稱為 反組譯碼):
u (Unassemble) 命令反組譯碼,並顯示機器語言的指定區段。
uf (Unassemble Function) 命令反組譯碼,並顯示函式。
up (Unassemble from Physical Memory) 命令將儲存在物理記憶體中指定的機器語言區段反編譯並顯示出來。
ur(Unassemble Real Mode BIOS) 命令用於反組譯並顯示指定的 16 位元真實模式代碼。
ux (Unassemble x86 BIOS) 命令反組譯碼,並在指定的地址顯示以 x86 為基礎的 BIOS 程式代碼指令集。
(僅限 WinDbg)反組譯視窗將指定的機器語言區段進行反組譯並顯示。 如果您選取視窗選單上的自動開啟反組譯碼命令,則此視窗會自動作用中。 您也可以在檢視功能表上選取 [反組譯碼]、按 alt+7 或按 [反組譯碼] 按鈕來開啟此視窗。
反編譯顯示會出現在四個欄位中:位址位移、二進制代碼、組合語言助記符和組合語言詳細內容。 下列範例顯示此顯示。
0040116b 45 inc ebp
0040116c fc cld
0040116d 8945b0 mov eax,[ebp-0x1c]
在代表目前程式計數器的行右邊,顯示正在存取的任何記憶體位置或寄存器的值。 如果這一行包含分支指令,表示法 [br=1] 或 [br=0] 隨即出現。 這個表示法指示採用或不採用的分支。
您可以使用 .asm (變更反組譯碼選項) 命令來變更反組譯指令的顯示方式。
在 WinDbg 的反組譯視窗中,突顯顯示代表目前程式計數器的行。 設定斷點的行也會加亮顯示。
您也可以使用下列命令來操作組合語言程式碼:
# (搜尋反組譯模式) 命令會搜尋特定模式的記憶體區域。 此命令相當於搜尋反組譯碼顯示四個數據行。
a (Assemble) 命令可以接受元件指示,並將其轉譯為二進位機器碼。
元件模式和來源模式
調試程式有兩種不同的作業模式: 元件模式 和 來源模式。
當您單步執行應用程式時,單步的大小是依模式而定的組合語言代碼的一行或原始碼的一行。
根據模式,數個命令會建立不同的數據顯示。
在 WinDbg 中,當您在組合語言模式中執行或單步執行應用程式時,反組譯視窗會自動移至前台。 在來源模式中, [來源] 視窗 會移至前景。
若要設定模式,您可以執行下列其中一項動作:
使用 l+、l- (設定來源選項) 命令來控制模式。 l-t 命令會啟動組合模式。
(僅限 WinDbg)清除 [偵錯] 功能表上的 [來源模式] 命令,讓調試程序進入元件模式。您也可以選取工具列上的 [來源模式關閉] 按鈕。
在 WinDbg 中,當您處於元件模式時, ASM 會顯示在狀態列上。
WinDbg 反組譯碼視窗中的快捷方式功能表包含 來自目前源程式行命令的醒目提示指示 。 此命令會反白顯示對應至目前源行的所有指示。 程式碼行通常會對應到多個組合指令。 如果程式代碼已優化,這些組合語言指令可能不是連續的。 「從目前來源程式行突出顯示指令」命令讓您能找到所有依據目前來源行組合的指令。
元件語言來源檔案
如果您的應用程式是以元件語言撰寫,則調試程式產生的反組譯碼可能不符合原始程序代碼。 特別是 NO-OPs 和批注不會存在。
如果您想要藉由參考原始 .asm 檔案來偵錯程式代碼,您必須使用來源模式偵錯。 您可以像載入 C 或 C++ 原始程式檔一樣載入組件檔案。 如需這類偵錯的詳細資訊,請參閱 在來源模式中偵錯。