DbgEng 延伸模組 DLL 的結構
DbgEng 延伸模組 DLL 會匯出許多回呼函式,其中一些函式可能是擴充命令的實作。
調試 程式引擎 會載入這些擴充 DLL,而且可以在 Microsoft Windows 上執行使用者模式或核心模式偵錯時,提供額外的功能或自動化工作。
如果您執行了 Windows 偵錯工具的完整安裝,您可以在安裝目錄的 sdk\samples\exts 子目錄中找到名為 「exts」 的範例 DbgEng 延伸模組。
擴充功能命令
擴充 DLL 可以匯出用來執行擴充功能命令的任意數目函式。 每個函式在 .def 檔案中明確宣告為匯出,而且其名稱必須完全包含小寫字母。
用來實作擴充命令的函式必須符合原型 PDEBUG_EXTENSION_CALL。
這些函式會根據標準 C++ 慣例來命名,但不允許大寫字母。 匯出的函式名稱和延伸模組命令名稱相同,不同之處在于擴充功能命令的開頭為驚嘆號 (!) 。 例如,當您將 myextension.dll 載入偵錯工具,然後在 [偵錯工具命令] 視窗中輸入 !stack 時,偵錯工具會在 myextension.dll 中尋找名為 stack 的匯出函式。
如果尚未載入 myextension.dll,或在其他擴充 DLL 中可能有其他具有相同名稱的擴充命令,您可以在 [偵錯工具命令] 視窗中輸入 !myextension.stack ,以指出該 DLL 中的擴充 DLL 和擴充功能命令。
其他匯出的函式
DbgEng 延伸模組 DLL 必須匯出 DebugExtensionInitialize。 載入 DLL 時,將會呼叫此專案,以初始化 DLL。 DLL 可以使用它來初始化全域變數。
擴充 DLL 可能會匯出 DebugExtensionUninitialize。 如果匯出此專案,則會在卸載擴充 DLL 之前呼叫它。 DLL 可能會在卸載之前先加以清除。
延伸模組 DLL 可能會匯出 DebugExtensionNotify。 如果匯出此專案,則會在會話開始或結束,以及當目標啟動或停止執行時呼叫。 這些通知也會提供給向用戶端註冊的 IDebugEventCallbacks 物件。
擴充 DLL 可能會匯出 KnownStructOutput。 如果匯出此專案,則會在載入 DLL 時呼叫它。 此函式會傳回 DLL 知道如何在單行上列印的結構清單。 稍後可以呼叫它來格式化這些結構的實例以進行列印。
載入 DbgEng 擴充 DLL 的引擎程式
載入擴充 DLL 時,會依下列順序由引擎呼叫回呼函式:
DebugExtensionInitialize 稱為 ,因此擴充 DLL 可以初始化。
如果匯出,如果引擎有作用中的會話,則會呼叫 DebugExtensionNotify ,並在會話暫停且可存取時再次呼叫。
如果匯出, 則會呼叫 KnownStructOutput 來要求 DLL 知道如何在單行列印的結構清單。
如需如何使用偵錯工具載入和卸載延伸模組 DLL 的詳細資訊,請參閱 載入偵錯工具延伸模組 DLL ,如需有關執行擴充功能命令的資訊,請參閱 使用偵錯工具擴充功能命令 。
偵錯工具引擎會在呼叫擴充 DLL 時放置 try /except 區塊。 這可保護引擎免于延伸模組程式碼中的某些錯誤類型;但是,由於擴充功能呼叫是在與引擎相同的執行緒中執行,因此仍會導致它當機。