使用 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.dll
和 symsrv.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 获取符号的主要内容,如果未能解决你的问题,请参考以下文章