首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dbghelp查找类方法的符号地址

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

Stack Overflow用户
提问于 2013-08-12 16:50:48
回答 1查看 1.9K关注 0票数 3

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

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

代码语言:javascript
复制
0:000> x dxgi!CDXGIFactory::CreateSwapChain
6acb78ce          dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)
6acdaf69          dxgi!CDXGIFactory::CreateSwapChain (<no parameter info>)

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

代码语言:javascript
复制
result = SymFromName( hprocess, L"dxgi!CDXGIFactory::CreateSwapChain", &symbol )
// result is false, GetLastError is 1168

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 00:08:50

导致抛出1168错误的绝对是SYMOPT_EXACT_SYMBOL设置。否则,具有多个符号或“::”就可以了,API可以返回有效的地址。

一种解决办法是使用破损的名字:

代码语言:javascript
复制
#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来查找多个符号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18192455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档