1

我正在尝试使用 xperf 来分析我的 DLL,但它拒绝使用我的 DLL 的 PDB 文件。使用 -symbols 在 .etl 上运行 xperf,我得到:

DBGHELP: mydll- private symbols & lines
         C:\mydll\debugu\mydll.pdb - unmatched

这让我相信它认为我的 PDB 与应用程序正在使用的 DLL 不匹配。这是错误的;它确实匹配。我已经使用 procexp 确认了应用程序链接的 DLL 的路径,完全重建了项目,等等。它仍然认为它不匹配。

关于什么可能是错误的任何想法?

4

3 回答 3

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 上还有一篇名为“Under the Covers with XPerf”的好博客文章,其中介绍了 XPerf 中的符号处理。

请注意,我需要使用正确的值设置系统环境变量,xperfview 没有选择批处理文件中的环境设置(在启动 XPerfView 后立即检查 Trace,Configure Symbol Path 菜单选项)

于 2010-07-21T16:37:42.713 回答
2

对不起,我问了这个问题并忘记了。

实际上有两个问题。

首先是 xperf 实际上使用的是我的符号的旧缓存版本。这是通过从符号缓存中删除它来修复的。

第二个是当我在 xperfview 中加载符号时,它实际上并没有将我最新的 pdb 放入符号缓存中。但是,pdb 位于我确认包含在 _NT_SYMBOL_PATH 变量中的目录中。不幸的是,我不记得用于修复此问题的确切命令,但我相信它是一个“ xperf file.etl -symbols ”变体。此命令正确解析 etl 并在遇到所有相关符号时加载/缓存它们。在此之后,xperfview 可以正确显示我的符号。

请注意,每当我的 pdb 发生更改时,我都必须重新运行该命令,因为 xperfview 仍然不会触及符号缓存中尚未存在的任何内容。我仍然不确定为什么它在我的机器上会这样,其他人似乎没有这个问题。

于 2010-08-01T02:41:19.837 回答
1

我刚刚在 SO 上发布了一个类似问题的答案,这可能与这里遇到的问题有关......

基本上,如果 DLL 是动态加载的,则可能会导致 XPerf 在符号加载方面出现问题。

就个人而言,我这是关于 XPerf 中的逻辑决定是否尝试为给定模块加载符号。例如“加载所有 EXE 及其 IAT 条目”(这将跳过所有动态 DLL - 似乎并非如此,但正在发生类似的事情)

编辑:

我最近与一位同事讨论了这个问题,并了解到 XPerf 将正确“决定”为以编程方式加载的 DLL 加载符号……如果DLL 保持加载状态直到进程终止。

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

于 2016-06-01T00:56:23.207 回答