1

我一直在使用 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 并重复了上述操作。

完成所有这些操作后,我现在可以为大多数不是我自己的代码的模块正确显示函数名称,但我无法显示我的 dll。dll 正在发布模式下编译(经过优化),但我将 Visual Studio 项目专门设置为创建 pdb,我已验证 pdb 存在并且它位于我的 _NT_SYMBOL_PATH 上的目录中。有谁知道我该如何解决这个问题,或者至少进一步调试它?

4

4 回答 4

2

您可以设置一些环境变量以在符号加载期间启用诊断日志记录:

  • DBGHELP_DBGOUT = 1
  • DBGHELP_LOG = C:\dbghelp.log
于 2011-12-21T22:28:03.940 回答
1

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

此外,我尝试使用复制到我的 WPA 'bin' 文件夹symchk中的相同dbghelp.dll/ symsrv.dllDLL 启动,以确保我的 PDB 是可定位的。(还在想我要疯了……)

我应该注意:我的 _NT_SYMBOL_PATH 值包含具有 lcl 缓存和直接本地位置的服务器: _NT_SYMBOL_PATH=srv*D:\SymbolCache*http://msdl.microsoft.com/download/symbols;D:\GitHub\....

然后我突然意识到,我的“合作伙伴”EXE 使用的 DLL 是通过 LoadLibrary()/GetProcAddress()动态加载的……这可能是 XPerf 的问题吗??????

我什至犹豫了一下...

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

结果...

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

编辑:我刚刚在 MSDN 上找到了这个URL,有人在 11 年发布了代码,展示了类似(相同?)的问题

编辑

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

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

于 2016-06-01T00:44:51.787 回答
0

我不确定这是否有帮助,但除了 xperf 上的问答之外,我今天遇到的另一个细节无法加载我的 DLL 的符号

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

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

于 2012-01-10T14:04:01.017 回答
0

尝试使用 wpa 而不是 xperfview。它使用与 xperfview 相同的系统来加载符号,但它还有一个诊断控制台,可让您查看有用的符号加载消息。

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

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

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

有关更多信息,请参阅:

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

于 2013-12-13T04:29:54.927 回答