SymFromAddr返回“找不到指定的模块”。

时间:2010-11-20 16:09:22

标签: c++ windows debug-symbols

我正在尝试从堆栈中获取的地址中获取符号,但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的目录中! 我究竟做错了什么? 谢谢:))

1 个答案:

答案 0 :(得分:1)

SymFromAddr有点反复无常。

  1. 如果在SymInitialize和SymFromAddr之间出现任何LoadLibrary,它可能无法正常工作。如果SymFromAddr你可以再次执行SymInitialize(提示:你可以缓存地址以避免很多SymInitialize这是一个巨大的CPU消费者)
  2. SymFromAddr(即SymFromAddr64)的64位实现效果更好
  3. 如果代码未经过优化,则效果会更好
  4. VC9生成的pdb比旧版本更好。
  5. 您可以在以下代码中找到一些想法 http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281