1

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

4

1 回答 1

1

SymFromAddr 有点反复无常。

  1. 如果在 SymInitialize 和 SymFromAddr 之间发生任何 LoadLibrary,它可能不起作用。如果 SymFromAddr 你可以再次执行 SymInitialize (提示:你可以缓存地址以避免大量的 SymInitialize 这是一个巨大的 CPU 消耗)
  2. SymFromAddr(即 SymFromAddr64)的 64 位实现效果更好
  3. 如果代码没有优化,它会更好地工作
  4. VC9 生成的 pdb 比旧版本更好。

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

于 2010-12-23T08:12:29.443 回答