アドレスによるシンボル情報の取得
次のコードは、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);
}