符号支持

正确配置 Windows Performance Analyzer (WPA) 后,WPA 会显示记录中找到的地址的符号文件中的符号名称。

为了解码符号,工具必须找到程序数据库文件(称为程序数据库 (PDB) 文件或符号文件)以生成完整的调用堆栈。 当系统生成组件时,编译器和链接器生成 PDB 文件。 Microsoft 为联机符号服务器中的许多 Microsoft 产品提供程序数据库文件。 适用于 Windows 的 Microsoft 调试工具和 WPA 使用联机符号服务器查找符号信息。 因此,如果未在本地复制符号文件,计算机必须连接到 Internet。 Windows Performance Toolkit 使用与 Windows 调试程序 Windbg.exe 相同的符号解码基础结构。 有关详细信息,请参阅 WinDbg

若要配置符号支持,必须定义 _NT_SYMBOL_PATH 环境变量。 下面的示例将符号路径设置为将 Microsoft 公共符号服务器与 C:\symbols 中的下游存储一起使用:

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

请注意,此示例是一个单一的命令行。

此符号路径中的 URL 指定了联机 Microsoft 符号服务器。 星号之间的路径 (C:\symbols) 指定了下游存储。 这是符号解析系统在其中保留符号文件的本地缓存。 WPA 工具还会对你开发的组件中的符号进行解码。 将一个或多个路径添加到 _NT_SYMBOL_PATH,其中包含你要记录的组件的 PDB 文件。 例如,下面的示例展示了如何为上一个示例设置路径:

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

当 Xperf 或 WPA 对符号进行解码时,Xperf 或 WPA 会将原始符号文件或 PDB 的精简版本缓存在 \symcache 目录中的磁盘上。 为此,Xperf 或 WPA 使用当时可用的符号。 在 Microsoft 外部可用的操作系统符号是公共符号。 这些符号包含的信息比内部专用符号要少。 在黑盒测试中,公共符号也可能包含不正确的信息。 专用符号更可靠,可以根据保密协议获得。 如果有用户已使用公共符号对记录进行了解码,然后用户获取了专用符号,则用户必须先清除 \symcache 目录,然后 Xperf 或 WPA 才能发现新的专用符号。

排查符号解码问题

符号解码的支持很复杂。 必须满足以下要求:

  • 必须在 Xperf 命令行上指定 -symbols,或者在打开记录后,在 WPA 中的“跟踪”菜单上选择“加载符号”。

  • 必须正确配置环境变量。 有关 Xperf 的详细信息,请参阅符号

  • ETW 内核记录文件必须已停止并已正确合并。 有关详细信息,请参阅停止记录

  • Windows Performance Recorder (WPR) 或 WPA 将 ETW 用户记录文件与在同一计算机上同时创建的内核记录文件合并在一起。

  • 你必须有权访问 _NT_SYMBOL_PATH 指定的二进制文件和符号源。 如果使用符号服务器,则符号服务器通常只是一个重定向程序。 在这种情况下,必须有权访问符号服务器以及符号服务器指向的托管二进制文件和符号的站点。

  • _NT_SYMBOL_PATH 必须指向正确的文件。 如果文件存在于不同的生成或体系结构中,这些文件将不起作用。 如果应用程序二进制文件的版本与 _NT_SYMBOL_PATH 指向的符号的版本不同,你将无法查看调用堆栈。

    要排除符号不匹配的情况,请使用“Windows 调试工具”分发中的 Symchk.exe,以确保符号与进行记录的计算机上的符号文件匹配。 例如:

    symchk /v <local_file> /s <sympath_to_name.pdb>
    

    要排除二进制文件不匹配的情况,请使用 fc /b 命令,确保进行记录的计算机上的二进制文件与删除共享上的二进制文件匹配。 例如:

    fc /b <local_file> <drop_share_file>
    
  • 在 Xperf 中,必须至少使用 PROC_THREAD+LOADER 标志捕获 ETW 内核记录。 这些标志提供了有关进程生存期和进程内存中的映像虚拟地址范围的基本信息。 此信息可帮助 XPerf 将虚拟地址解码为映像和符号。

    要验证是否已在 ETW 内核记录中启用了这些标志,请检查 Xperf -process 事件(“创建”、“删除”、“开始断开”、“结束断开”)和 Image 事件(“加载”、“卸载”、“开始断开”、“结束断开”)是否存在于使用以下命令生成的表中:

    xperf -i kernel.etl -a tracestats -detail
    

    注意:这些事件可能不会全部在表中列出,具体取决于这些事件是否发生。

Xperf 符号解码的限制

如果没有为可执行映像(如 \Path\Library.dll)指定驱动器,则 Xperf 默认为系统驱动器。 当你运行 -d/-merge 命令时,如果 Xperf 找不到在记录期间存在于运行进程中的可执行映像,Xperf 将无法检索相应的映像和符号文件标识信息并将信息添加到合并的记录中。 如果没有这些信息,Xperf 就不能为该记录中的该映像执行符号解码。

此问题不会影响其他文件路径,例如磁盘 I/O 或文件 I/O 中的路径。

为了启用符号解码,并帮助在 Xperf ETW 记录中启用正确的映像加载和卸载路径,应在系统驱动器上存储可能需要符号解码或映像加载和卸载路径的所有可执行映像。 然后,从该驱动器运行映像。 如果无法实现,请在系统驱动器上创建映像的一个镜像,即使从另一个驱动器运行映像也是如此。 例如,如果 C: 是系统驱动器,请在 C:\game\bin\binkw32.dll 中创建 D:\game\bin\binkw32.dll 的一个相同副本。

Windows 性能工具包

symbols

使用 CLR 4.0 NGEN PDB 支持

常见的“深入分析”问题