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