依名稱擷取符號資訊

下列程式代碼示範如何呼叫 SymFromName 函式。 此函式會填入 SYMBOL_INFO 結構。 因為名稱長度是可變的,因此您必須提供夠大的緩衝區,以保存儲存在SYMBOL_INFO結構結尾的名稱。 此外, MaxNameLen 成員必須設定為保留給名稱的位元組數目。 在此範例中,szSymbolName 是儲存所要求符號名稱的緩衝區。 此範例假設您已使用初始化符號處理程式中的 程式代碼來初始化符號處理程式

TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
    MAX_SYM_NAME * sizeof(TCHAR) +
    sizeof(ULONG64) - 1) /
    sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

_tcscpy_s(szSymbolName, MAX_SYM_NAME, TEXT("WinMain"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromName(hProcess, szSymbolName, pSymbol))
{
    // SymFromName returned success
}
else
{
    // SymFromName failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymFromName returned error : %d\n"), error);
}

如果應用程式具有模組或來源檔名以及行號資訊,則可以使用 SymGetLineFromName64 來擷取虛擬程式代碼位址。 此函式需要IMAGEHLP_LINE64結構的指標,才能接收虛擬程式代碼位址。 請注意,只有在使用 SymSetOptions 函式設定SYMOPT_LOAD_LINES選項時,符號處理程式才能擷取行號資訊。 在載入模組之前,必須先設定此選項。 szModuleName 參數包含來源模組名稱;這是選擇性的,可以是 NULL。 szFileName 參數應該包含來源檔名,而 dwLineNumber 參數應該包含將擷取虛擬位址的行號。

TCHAR  szModuleName[MAX_PATH];
TCHAR  szFileName[MAX_PATH];
DWORD  dwLineNumber;
LONG   lDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
_tcscpy_s(szModuleName, MAX_PATH, TEXT("MyApp"));
_tcscpy_s(szFileName, MAX_PATH, TEXT("main.c"));
dwLineNumber = 248;

if (SymGetLineFromName64(hProcess, szModuleName, szFileName,
    dwLineNumber, &lDisplacement, &line))
{
    // SymGetLineFromName64 returned success
}
else
{
    // SymGetLineFromName64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromName64 returned error : %d\n"), error);
}