我正在尝试从从堆栈中获取的地址中获取符号,但是SymFromAddr始终失败,并出现系统错误126(找不到指定的模块。)
我正在初始化具有象征意义的东西

SymInitialize(m_processHandle, NULL, TRUE);

(最后一个参数== true ==>它会自动加载PDB)

我像这样使用SymFromAddr:
SYMBOL_INFO_PACKAGE sym = { sizeof(sym) };
sym.si.MaxNameLen = MAX_SYM_NAME;
DWORD64 displacement = 0;
bool ok = SymFromAddr(m_processHandle, address, &displacement, &sym.si);

代码在Windows的C++中。
PDB文件位于EXE目录中!
我究竟做错了什么?
谢谢 :)

最佳答案

SymFromAddr有点反复无常。

  • 如果SymInitialize和SymFromAddr之间发生任何LoadLibrary,则它可能不起作用。如果使用SymFromAddr,则可以再次执行SymInitialize(提示:您可以缓存地址以避免大量的CPU消耗大量的SymInitialize)
  • SymFromAddr(即SymFromAddr64)的64位实现效果更好
  • 如果未优化代码,它将更好地工作
  • VC9生成的pdb比旧版本更好。

  • 您可以在以下代码中找到一些想法
    http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281

    关于c++ - SymFromAddr返回“找不到指定的模块。”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4233649/

    10-11 16:56