名前によるシンボル情報の取得

次のコードは、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);
}