Windows性能分析器概述(四)

六、Windows性能分析器对符号的支持

   

    正确设置后,Windows性能分析器能够通过符号文件显示特定地址上的符号名。在样本收集和环境转换中符号解码会非常有用。

    若要需要解码符号,工具需要找到程序数据文件,比如PDB或者符号文件,用来生成完整的调用堆栈。在生成一个组件时,编译器或者连接器会负责生成PDB文件。微软有在线的符号服务器,提供各种产品的程序数据文件。Microsoft Debugging Tools和WPA使用它来寻找符号信息。需要注意的是,你需要连接到互联网才能使用这个功能。Xperf工具使用与Windows debugger(Windbg.exe)相同的符号解析系统。更多关于windbg和操作系统符号,请参考Debugging Tools for Windows - Overview(英文)。

    若要获得符号支持,需要定义一个叫_NT_SYMBOL_PATH的环境变量。下面的例子使用微软公共的符号服务器作为符号路径,并将下载目录设置为c:\symbols:

set _NT_SYMBOL_PATH= srv*C:\symbols*https://msdl.microsoft.com/downloads/symbols

    符号路径中的地址指向微软符号服务器。星号之间的路径(c:\symbols)代表下载目录,这是符号解析系统维护的本地缓存。xperf也会解码你自己开发组件的符号,只需要在_NT_SYMBOL_PATH中添加更多的包含需要的符号路径就能做到这一点。下面是一个例子:

set _NT_SYMBOL_PATH=c:\coding\fs\release;srv*C:\symbols*

    使用WPA命令行- symbols也可以开启符号解码功能。你可以通过以下命令来获得关于符号支持的更多信息:

xperf –help symbols

调试符号解码

    WPA追踪符号解码支持比较复杂。请确认满足一下的条件:

  • 在命令行下使用了-symbols参数,或者在打开摘要表格前在性能分析器里选择了”Load Symbols”。

 

  • 按照在线帮助配置了环境变量:
    xperf -help symbols
  • ETW内核追踪文件已经关闭,并正确地合并。相关信息请参考Stopping a Trace(英文)。

 

  • ETW用户追踪文件由xperf或者性能分析器处理,并与同时在同一台机器生成的内核追踪文件相关联。

 

  • 具有访问二进制文件和_NT_SYMBOL_PATH中指定的路径的权限。如果你使用符号服务器,请注意在很多情况下符号服务器只是做重定向。如果是这样,请确保你同时具有访问符号服务器和真正存有文件服务器的权限。

 

  • 请确认_NT_SYMBOL_PATH指向正确的文件。如果文件是从不同的编译中产生,它们可能不能正常工作。如果二进制文件版本与_NT_SYMBOL_PATH中指向的符号文件版本不符,显示调用堆栈将不能正常工作。
    为了避免符号不匹配,请使用Debugging Tools for Windows提供的symchk.exe来检查符号文件是否符合将要追踪的二进制文件:
    symchk /v <local_file> /s <sympath_to_name.pdb>
    为了避免二进制文件不匹配,使用fc /b来检查本机上使用的二进制文件与服务器上的文件是否一致:
    fc /b <local_file> <drop_share_file>

 

  • 请确认在捕获内核追踪时至少使用了PROC_THREAD和LOADER标志。这些标志提供了一些基本信息,包括进程生命周期和镜像文件在进程中的虚拟地址,它会帮助将虚拟地址解码为镜像文件和符号。
    为了确保ETW内核追踪开启了这些标志,请查看由以下命令生成的表格中是否存在进程事件和镜像文件事件:
    xperf -i kernel.etl -a tracestats -detail

    以上文章基于Symbol Support翻译。

 

 

译者:张昕毅、焦桢

微软亚太研发集团服务器与开发工具事业部(中国)

Windows性能分析器概述(一)

Windows性能分析器概述(二)

Windows性能分析器概述(三)