无法让xperfview加载DLL的符号

时间:2011-12-21 21:34:19

标签: windows profiling xperf

我一直在用xperf对抗牙齿和钉子,以获得我正在分析的工具的符号。我在工具中运行的代码在.exe和.dll之间分开 - 这是在.dll中分析的重要内容。我跑了xperf:

xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE -stackwalk profile

然后我运行了一点工具,然后

xperf -d profile.etl

然后我尝试了xperfview。我加载了配置文件,打开了“加载符号”,并打开了摘要表。根本没有符号 - 字面模块在函数列中显示为“未知”。我已经在这方面搜索了其他主题,这就是我尝试过的方法:

  1. 我设置了我的环境变量,_NT_SYMBOL_PATH和_NT_SYMCACHE
  2. 我清除了符号缓存并运行xperf -symbols -i profile_results.etl。
  3. 我从最新版本的Windows调试工具复制了dbghelp.dll,并重复了上述内容。
  4. 完成所有这些后,我现在可以正确显示大多数我自己的代码模块的函数名称,但是我无法显示我的dll。 dll正在以发布模式编译(有优化),但我专门设置Visual Studio项目来创建一个pdb,我已经验证了pdb存在并且它在我的_NT_SYMBOL_PATH目录中。有谁知道如何解决这个问题,或者至少进一步调试它?

4 个答案:

答案 0 :(得分:2)

您可以set some environment variables在符号加载期间启用诊断日志记录:

  • DBGHELP_DBGOUT = 1
  • DBGHELP_LOG = C:\ dbghelp.log

答案 1 :(得分:0)

我不确定这是否有帮助,但除了xperf can't load my DLL's symbols上的Q& A之外,我今天遇到的还有一个细节:

对我来说,xperfview不喜欢映射网络驱动器上的PDB文件:因为我在与构建代码的机器不同的机器上运行xperf和xperfview,我从网络共享中获取了可执行文件和PDB文件,我映射到一个驱动器号,重新创建与构建机器完全相同的绝对路径 - 没有运气。即使将带有PDB文件的文件夹添加到符号路径也无济于事。

一旦我确定.pdb文件位于本地文件夹中,一切都按预期工作。

答案 2 :(得分:0)

尝试使用wpa而不是xperfview。它使用相同的系统来加载xperfview所做的符号,但它也有一个诊断控制台,可以让你看到符号加载消息,这可能会有所帮助。

另外,您应该告诉我们_NT_SYMBOL_PATH设置为什么。有很多方法可以错误设置。

此外,在_NT_SYMBOL_PATH中,您应该为PDB文件指定本地缓存 - 然后您可以在那里检查您的PDB是否已被复制到本地缓存。

您还可以查看SymCache路径(由_NT_SYMCACHE_PATH指向,默认为c:\ symcache),这是存储WPT .symcache文件的位置。 PDB文件转换为此格式,.symcache文件最终由WPA和xperfview加载。

有关详细信息,请参阅:

http://randomascii.wordpress.com/2012/10/04/xperf-symbol-loading-pitfalls/

答案 3 :(得分:0)

我刚遇到同样的问题...尝试了所有相同的步骤...浏览了所有(显然)类似的建议...

此外,我尝试使用我复制到WPA' bin'中的symchk / dbghelp.dll个DLL来启动symsrv.dll。文件夹,以确保我的PDB是可定位的。 (仍然以为我疯了......)

我应该注意:我的_NT_SYMBOL_PATH值包含lcl cache& amp;直接到达当地位置:_NT_SYMBOL_PATH=srv*D:\SymbolCache*http://msdl.microsoft.com/download/symbols;D:\GitHub\...

然后我突然意识到我的DLL,我的#34;伙伴" EXE,通过LoadLibrary()/ GetProcAddress()加载动态 ...这可能是XPerf的一个问题?????

我甚至犹豫不决......

我在我的DLL中添加了一个无用的导出,我直接在EXE中调用它(触发我的DLL的导入表条目)所以现在EXE 依赖于在DLL上甚至加载。

原来......

.............然后XPerf加载了所有符号:)。

修改:我刚刚在MSDN上找到了此URL,其中有人在' 11中发布了代码,表明了类似(相同的?)问题

修改

我最近和一位同事讨论了这个问题,并了解到XPerf会正确地决定""加载以编程方式加载的DLL的符号... IF DLL将一直加载,直到进程终止。

因此,对于在执行期间加载和卸载的DLL,并在终止时卸载... XPerf将跳过尝试加载这些符号。