我正在尝试使用xperf来配置我的DLL,但它拒绝使用我的DLL的PDB文件。 使用-symbols在.etl上运行xperf,我得到:
DBGHELP: mydll- private symbols & lines
C:\mydll\debugu\mydll.pdb - unmatched
这让我相信它认为我的PDB与应用程序使用的DLL不匹配。这是错的;它确实匹配。我已经使用procexp确认了应用程序链接的DLL的路径,完全重建了项目,等等。它仍然认为它不匹配。
关于什么可能出错的任何想法?
答案 0 :(得分:2)
尝试将SYSTEM环境变量_NT_SYMBOL_PATH设置为指向.pdb文件_NT_SYMCACHE_PATH以指向c:\ Symbols。请参阅http://msdn.microsoft.com/en-us/library/ff191023(VS.85).aspx
上有关XPerf符号处理的文档在WindowsItPro dot com上还有一篇很好的博客文章标题为“XPerf的封面”,涵盖XPerf中的符号处理。
请注意,我需要使用正确的值设置系统环境变量,设置xperfview未捕获批处理文件中的环境(检查跟踪,启动XPerfView后立即配置符号路径菜单选项)
答案 1 :(得分:2)
抱歉,我问过这个问题并忘记了。
实际上有两个问题。
第一个是xperf实际上使用了我的符号的旧缓存版本。通过从符号缓存中删除它来解决此问题。
第二个是当我在xperfview中加载符号时,它实际上并没有将我最新的pdb放入符号缓存中。但是,pdb位于我确认的目录中,该目录包含在_NT_SYMBOL_PATH变量中。不幸的是,我不记得用于解决此问题的确切命令,但我认为它是' xperf file.etl -symbols '变体。此命令正确解析了etl并在遇到它们时加载/缓存了所有相关符号。在此之后,xperfview可以正确显示我的符号。
请注意,我必须在pdb更改时重新运行命令,因为xperfview仍然不会触及符号缓存中尚未存在的任何内容。我仍然不确定为什么它在我的机器上表现如此,其他人似乎没有这个问题。
答案 2 :(得分:1)
我刚刚在SO上发布了answer类似的问题,可能与此处遇到的问题有关......
基本上,如果DLL是动态加载的,它可能会导致XPerf在符号加载方面出现问题。
就个人而言,我猜测它是关于XPerf中的逻辑决定是否甚至尝试加载给定模块的符号。例如“加载所有EXE和它们的IAT条目”(这将跳过所有动态DLL - 这似乎不是这种情况,但类似的情况正在发生)
编辑:
我最近与一位同事讨论了这个问题,并了解到XPerf将正确“决定”加载以编程方式加载的DLL的符号... IF DLL将一直加载,直到进程终止。< / p>
因此,对于在执行期间已加载和的DLL,并在终止时卸载... XPerf将跳过尝试加载这些符号。