EEAddIn 範例:偵錯運算式評估工具增益集
更新:2007 年 11 月
這個 EEAddin 範例會說明如何使用運算式評估工具增益集 (Expression Evaluator Add-In) API 來擴充原生偵錯工具的運算式評估工具。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
EE 增益集 API
運算式評估工具是偵錯工具中負責解譯 (評估) 運算式的部分,當您在運算式上設定中斷點或是在偵錯工具視窗中輸入運算式時,運算式評估工具會解譯該輸入。如需詳細資訊,請參閱偵錯工具的運算式。您可以使用運算式評估工具增益集 API 來擴充運算式評估工具,以便處理新的型別。
若要為新型別擴充運算式評估工具,您需要編寫將是 Win32 DLL 部分內容的一個函式 (與 autoexp.dat 位於相同目錄中),並依名稱將其匯出。您也需要在 autoexp.dat 檔案中加入程式碼。您可以從 DLL 匯出多個函式,為多種型別來擴充運算式評估工具。
建置和執行範例
建置和執行本範例的必要步驟分為三個部分。
若要建置和執行範例
建置運算式評估工具增益集 DLL (eeaddin.dll)。
編輯 autoexp.dat,以便使用運算式評估工具增益集 DLL。
建立一個使用自訂資料型別 (將由 autoexp.dat 評估) 專案來測試該增益集。
下列程序將詳細說明這些步驟。
若要建置運算式評估工具增益集 DLL
在 Visual Studio 中,開啟 eeaddin.sln 方案。
從 [建置] 功能表中,按一下 [建置]。
複製產生的 eeaddin.dll 至 common7\ide 目錄 (即包含 devenv.exe 的目錄)。
從 [檔案] 功能表中,按一下 [關閉方案]。
若要編輯 autoexp.dat
從 [檔案] 功能表中,移至 [開啟],然後按一下 [檔案]。
在 [開啟檔案] 對話方塊中,尋找檔案 autoexp.dat (位於 common7\packages\debugger 目錄中),並按一下 [開啟]。
編輯 autoexp.dat 來加入下列幾行程式碼:
_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime@28) _FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime@28)
儲存 autoexp.dat。
若要建立使用自訂資料型別的專案
從 [檔案] 功能表中,移至 [新增],然後按一下 [專案]。
在 [新增專案] 對話方塊中,反白顯示 [Visual C++ 專案],並按一下 [MFC 應用程式],再輸入該專案名稱,並按一下 [確定]。
在 [MFC 應用程式精靈] 中,按一下 [完成]。此專案必須是 MFC 應用程式,因為您將會在下一步驟中加入 MFC 函式。
在 MFC 應用程式中,加入 SYSTEMTIME 或 FILETIME 物件。
SYSTEMTIME *s = new SYSTEMTIME(); FILETIME *f = new FILETIME(); GetSystemTime(s); SystemTimeToFileTime(s,f);
從 [建置] 功能表中,按一下 [建置]。
啟動偵錯並檢查監看式視窗中的 SYSTEMTIME 或 FILETIME 物件。
範例如何操作
若要為某自訂資料型別擴充運算式評估工具,您要在運算式評估工具增益集 DLL 中編寫自訂的檢視器函式。這個函式會在要進行偵錯的程式之記憶體空間 (而非要擴充的運算式評估工具的記憶體空間) 使用一個物件指標,您不可以在這個指標使用一般的轉換,您必須使用回呼函式 (Callback Function) 來讀取該指標及它所指向的資料。型別為 DEBUGHELPER* 的回呼函式可以使用不同方法來指向一個物件。
語法看起來像這樣:
HRESULT WINAPI CustomViewer(
DWORD dwAddress, // low 32-bits of address
DEBUGHELPER *pHelper, // callback pointer to access helper functions
int nBase, // decimal or hex
BOOL bIgnore, // not used
char *pResult, // where the result needs to go
size_t max, // how large the above buffer is
DWORD dwReserved // always pass zero
)
在範例中,這種型別的函式有兩個實作,即位於 timeaddin.cpp 的 AddIn_SystemTime 和 AddIn_FileTime。DEBUGHELPER 結構 (定義於 custview.h) 由可以協助您編寫擴充功能的函式指標構成。這個指標會傳遞至 CustomViewer 函式,以便您使用它來呼叫 Helper 函式。
您可以使用 pHelper->GetProcessorType 來取得處理器類型。讀取記憶體的方法有下列兩種:pHelper->ReadDebuggeeMemory 和 pHelper->ReadDebuggeeMemoryEx。ReadDebuggeeMemoryEx 會處理 64 位元位址並受到 Visual Studio .NET 偵錯工具的支援。ReadDebuggeeMemory 不會處理 64 位元位址但受到 Visual Studio .NET 和 Visual C++ 6.0 偵錯工具的支援。如果您的增益集僅為 Visual Studio .NET 偵錯工具所設計,您便可以使用 ReadDebuggeeMemoryEx。如果您的增益集也需要使用 Visual C++ 6.0,則必須檢查 dwVersion 欄位,並且避免為 Visual C++ 6.0 呼叫 ReadDebuggeeMemoryEx。
下列程式碼會使用以上所述的兩種偵錯工具,並讀取正在進行偵錯的程式之 localobject (其型別是 MyType) 內容:
DWORDLONG qwRealAddress;
DWORD dwGot;
MyType localobject;
if (pHelper->dwVersion<0x20000)
{
// Visual C++ 6.0 version
qwRealAddress = dwAddress;
pHelper->ReadDebuggeeMemory( pHelper, dwAddress,
sizeof(localobject), &localobject, &dwGot );
}
else
{
qwRealAddress = pHelper->GetRealAddress(pHelper);
pHelper->ReadDebuggeeMemoryEx( pHelper, qwRealAddress,
sizeof(localobject), &localobject, &dwGot );
}
// TODO: display localobject here
編輯 autoexp.dat
您將要在 autoexp.dat 的 [AutoExpand] 段落加入的程式碼具有下列語法:
type=$ADDIN(dllname.dll,exportname)
例如:
_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime)
或:
_FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime)
如果該 DLL 不是位於包含 devenv.exe 的目錄或者不是位於 PATH 中,您就必須為該 DLL 使用完整的路徑名稱。exportname 引數會區分大小寫,且必須與在您的 DLL 上執行 dumpbin –exports 時取得的匯出名稱完全相同。
若要測試包含新的增益集的偵錯工具,請先在安裝新的 DLL 時,停止偵錯任何偵錯中的程式,接著再啟動一個新的偵錯工具工作階段 (Session)。
注意:該增益集會執行於偵錯工具中,因此如果程式碼已毀損,您便會毀損這個 IDE。