依位址擷取符號資訊

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

DWORD64  dwDisplacement = 0;
DWORD64  dwAddress = SOME_ADDRESS;

char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
{
    // SymFromAddr returned success
}
else
{
    // SymFromAddr failed
    DWORD error = GetLastError();
    printf("SymFromAddr returned error : %d\n", error);
}

若要擷取指定位址的原始程式碼行號,應用程式可以使用 SymGetLineFromAddr64 此函式需要IMAGEHLP_LINE64結構的指標,才能接收對應至指定程式代碼位址的來源檔名和行號。 請注意,只有在使用 SymSetOptions 函式設定SYMOPT_LOAD_LINES,符號處理程式才能擷取行號資訊。 在載入模組之前,必須先設定此選項。 dwAddress 參數包含來源檔名和行號所在的程式碼位址。

DWORD64  dwAddress;
DWORD  dwDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
dwAddress = 0x1000000; // Address you want to check on.

if (SymGetLineFromAddr64(hProcess, dwAddress, &dwDisplacement, &line))
{
    // SymGetLineFromAddr64 returned success
}
else
{
    // SymGetLineFromAddr64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromAddr64 returned error : %d\n"), error);
}