2010-11-20 169 views
1

我想从我从我的筹码有地址的符号,但SymFromAddr保持与系统错误126(指定的模块找不到。)
我初始化symboling事情与SymFromAddr返回“无法找到指定的模块”。

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); 

的代码在C++上的窗户。 和PDB文件是在EXE的目录! 我在做什么错? 谢谢:)

+0

应该的sizeof(SYMBOL_INFO)代替的sizeof(符号);但不知道是否会导致错误。您可以使用Process Monitor来查看它是否在预期的位置。 – Luke 2010-11-21 03:01:54

+0

是什么?我如何使用Process Monitor来执行此操作? :) – Idov 2010-11-21 19:05:03

+0

您可以验证它是否从正确的位置加载.pdb文件。 – Luke 2010-11-23 15:36:29

回答

0

SymFromAddr有点反复无常。

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

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

相关问题