我一直在用xperf对抗牙齿和钉子,以获得我正在分析的工具的符号。我在工具中运行的代码在.exe和.dll之间分开 - 这是在.dll中分析的重要内容。我跑了xperf:
xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE -stackwalk profile
然后我运行了一点工具,然后
xperf -d profile.etl
然后我尝试了xperfview。我加载了配置文件,打开了“加载符号”,并打开了摘要表。根本没有符号 - 字面模块在函数列中显示为“未知”。我已经在这方面搜索了其他主题,这就是我尝试过的方法:
完成所有这些后,我现在可以正确显示大多数不我自己的代码模块的函数名称,但是我无法显示我的dll。 dll正在以发布模式编译(有优化),但我专门设置Visual Studio项目来创建一个pdb,我已经验证了pdb存在并且它在我的_NT_SYMBOL_PATH目录中。有谁知道如何解决这个问题,或者至少进一步调试它?
答案 0 :(得分:2)
您可以set some environment variables在符号加载期间启用诊断日志记录:
答案 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将跳过尝试加载这些符号。