我试图使用xperf来分析我的DLL,但它拒绝使用我的DLL的PDB文件。在使用-symbols的.etl上运行xperf时,我得到:
DBGHELP: mydll- private symbols & lines
C:\mydll\debugu\mydll.pdb - unmatched这让我相信它认为我的PDB与应用程序正在使用的DLL不匹配。这是错误的;它是匹配的。我已经使用procexp确认了应用程序所链接的DLL的路径,完全重新构建了项目,等等。它仍然认为它不匹配。
有什么想法可能是错误的吗?
发布于 2010-08-01 10:41:20
对不起,我问了这个问题,然后就忘了。
实际上有两个问题。
第一个问题是,xperf实际上使用的是我的符号的一个较旧的缓存版本。已通过从符号缓存中将其删除来修复此问题。
第二个问题是,当我在xperfview中加载符号时,实际上并没有将最新的pdb放到符号缓存中。不过,pdb位于一个目录中,我确认该目录包含在_NT_SYMBOL_PATH变量中。不幸的是,我不记得确切的命令用来解决这个问题,但我相信它是一个'xperf file.etl -symbols‘变体。此命令正确解析了etl,并在遇到相关符号时加载/缓存了所有相关符号。在此之后,xperfview可以正确地显示我的符号。
请注意,每当我的pdb发生变化时,我都必须重新运行该命令,因为xperfview仍然不会触及符号缓存中已经没有的任何内容。我仍然不确定为什么它会在我的机器上表现成这样,其他人似乎没有这个问题。
发布于 2010-07-22 00:37:43
尝试将系统环境变量_NT_SYMBOL_PATH设置为指向您的.pdb文件Symbols,使其指向c:\ _NT_SYMCACHE_PATH。请参阅http://msdn.microsoft.com/en-us/library/ff191023(VS.85).aspx上有关XPerf符号处理的文档
在WindowsItPro .com上也有一篇很好的博客文章"Under the covers XPerf“,它介绍了XPerf中的符号处理。
请注意,我需要用正确的值设置系统环境变量,xperfview没有选择在批处理文件中设置环境(在启动XPerfView后立即检查跟踪,配置符号路径菜单选项)
发布于 2016-06-01 08:56:23
我刚刚在上发布了一个类似问题的answer,所以可能与这里遇到的问题有关……
基本上,如果动态加载动态链接库,可能会给XPerf带来有关符号加载的问题。
就我个人而言,我猜测这是关于XPerf中的逻辑决定是否甚至尝试加载给定模块的符号。例如,“加载所有EXE及其IAT条目”(这将跳过所有动态DLL-这看起来不是这样的,但类似的事情正在发生)
编辑:
我最近和一位同学讨论了这个问题,并了解到XPerf将正确地“决定”为以编程方式加载的DLL加载符号... IF DLL将一直加载到进程终止。
因此,对于在执行期间加载和卸载的DLL,以及在终止时卸载的DLL...XPerf将跳过加载这些符号的尝试。
https://stackoverflow.com/questions/2746254
复制相似问题