windbg - 使用 dbghelp 查找类方法的符号地址

标签 windbg dbghelp

我正在尝试使用 dbghelp 来查找类方法的地址。 例如,一个 DirectX 方法 (DXGI):dxgi!CDXGIFactory::CreateSwapChainImpl

我有正确的符号并且定义了 _NT_SYMBOLS_PATH。 使用 WinDBG,以下“x”命令运行良好:

0:000> x dxgi!CDXGIFactory::CreateSwapChain
6acb78ce          dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)
6acdaf69          dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)

但是,尝试将此字符串与 SymFromName 一起使用时,出现错误 1168(未找到元素):

result = SymFromName( hprocess, L"dxgi!CDXGIFactory::CreateSwapChain", &symbol )
// result is false, GetLastError is 1168

失败是因为“::”,还是因为同一个符号有两个地址(我该如何解决?)。

最佳答案

肯定是 SYMOPT_EXACT_SYMBOL 设置导致抛出 1168 错误。否则有多个符号或 '::' 没问题,API 可以返回有效地址。

一种变通方法是使用损坏的名称:

#pragma optimize("", off)
class base
{
public:
    void method(int i)    { printf("in method(int)\n"); }
    void method(double d) { printf("in method(double)\n"); }
};

int __cdecl main(int argc, char* argv[])
{
    HANDLE hProcess = GetCurrentProcess();
    SymInitialize(hProcess, NULL, TRUE);
    SymSetOptions(SYMOPT_EXACT_SYMBOLS);
    SetLastError(0);

    SYMBOL_INFO symbol = {0};
    symbol.SizeOfStruct = sizeof(symbol);

    BOOL result = SymFromName(hProcess, "cpptest!?method@base@@QEAAXH@Z", &symbol);

    printf("symbol : 0x%I64X\n", symbol.Address);
    printf("error : %u, result : %u\n", GetLastError(), result);

    return 0;
}


为了将来引用,WinDbg 使用 IDebugSymbols::StartSymbolMatch用于查找多个符号的 API。

关于windbg - 使用 dbghelp 查找类方法的符号地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192455/

相关文章:

c++ - DbgHelp - 获取完整的符号签名(函数名称+参数类型)

windows - 调试(Win): DIA versus DBGHELP

windows - DLL 中 Unresolved 符号错误

c# - 使用 Visual Studio 事后调试 C# 应用程序

c - 从已卸载模块的 pdb 中提取结构信息

windbg - 如何连接windbg和virtualbox

assembly - 在 WinDbg 中编辑程序集

windbg - 如何直接在windbg中运行c/c++函数和汇编?

c++ - 分发 DbgHelp.DLL

clr - 获取 !dumpheap -stat 中未列出的 ValueTypes 的名称/MT 的有效方法