按名称检索符号信息

以下代码演示如何调用 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);
}