使用 xperf 获取符号

Posted

技术标签:

【中文标题】使用 xperf 获取符号【英文标题】:Getting the symbols with xperf 【发布时间】:2009-02-28 00:38:16 【问题描述】:

我通读了文档并使用了概述的命令,但是由于某种原因,我似乎没有得到任何符号,只是汇总表的函数列中的一系列“未知数”,除了最上面的应用程序集我正在尝试调试....我将环境变量设置为微软服务器,并且包含应用程序的 pdb 的目录。我还确保在调出汇总表之前选择“加载符号”项。

根据我正在阅读的信息,表格在加载符号时应该需要一些时间才能显示,但是对我来说表格几乎立即显示并且只有 sprite.exe->sprite.exe 中最上面的项目有函数名称,函数的其他行要么是空白要么是“未知”

我正在使用 Vista SP1。

这是我使用的批处理文件。我是否做了任何会阻止符号加载的事情?

REM start profiler
xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE^
 -stackwalk profile -minbuffers 16 -maxbuffers 1024 -flushtimer 0^
 -f tmp.etl
REM run the app we want to profile
sprite.exe
REM stop
xperf -d profile.etl
REM set symbol path
set _NT_SYMBOL_PATH = ^
 C:\Projects\C++\fl lib\bin;^ REM dlls
 C:\Projects\C++\fl lib\samples\bin;^ REM main exe
 SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
REM display profile
xperf profile.etl

【问题讨论】:

【参考方案1】:

它使用的是什么版本的dbghelp.dll?在使用%SystemRoot%\system32 中安装的dbghelp.dll 版本时,我无法让PDB 符号与kernrate 和其他实用程序一起使用。

您可能需要将最新版本的 Windows 调试工具中的 dbghelp.dllsymsrv.dll 复制到 XPerf 可以找到的目录中。

此外,您需要删除“=”之前的空格,否则您定义的是“_NT_SYMBOL_PATH”变量(包括名称中的尾随空格)。

在行尾包含 cmets 也不行。诸如“^”之类的行继续字符通常需要是该行的最后一个字符。当我(在 XP 上)运行该语句时,我最终得到“_NT_SYMBOL_PATH”等于“C:\Projects\C++\fl lib\bin; REM dlls”并且下一行出现错误。

【讨论】:

我刚刚添加了用于在此处发布的 cmets。但是,删除 = 周围的空格似乎已经修复了它。奇怪,因为我检查了 var 被设置了...一定是 xperf 不喜欢的 vars 值中的前导空格并且没有解析值的其余部分... 尝试在命令提示符下输入 'set foo=a&set foo = b' 然后 'echo "%foo%"&echo "%foo %"'。空格保留在变量的名称和值中。【参考方案2】:

尝试设置

TRACE_FORMAT_SEARCH_PATH

环境变量。如果这不起作用,您可能必须使用 TracePdb.exe(或至少使用常规路径而不是 SYM* 路径)从 PDB 中手动提取 TMF 文件。这是迄今为止使用 ETL 跟踪 / XPerf 最烦人的部分

【讨论】:

以上是关于使用 xperf 获取符号的主要内容,如果未能解决你的问题,请参考以下文章

无法让 xperfview 加载 DLL 的符号

xperf 拒绝加载任何符号

使用 xperf 分析网络事件

Xperf 摘要窗口混乱

xperf 调用堆栈函数:“System\Interrupts + DPCs”

perfmon 性能计数器是不是基于与 xperf 使用的 ETW 事件“底层”相同的东西?