3

我正在尝试使用 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

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

4

1 回答 1

3

肯定是 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 来查找多个符号。

于 2013-08-14T00:08:50.800 回答