【问题标题】:Windows Performance Analyzer Missing ImageId EventWindows 性能分析器缺少 ImageId 事件
【发布时间】:2018-08-26 13:19:26
【问题描述】:

我有一个应用程序,我想使用 Windows 性能分析器对其进行分析。一切正常,但我没有从我的应用程序中获得任何合理的堆栈跟踪。

有问题的应用程序是一个演示应用程序。如果所有检查都结束,这是为了给我一个很好的感觉。然后我想分析另一个应用程序。由于我可以完全控制我的演示应用程序,因此我包含了一些标记函数,它们应该会显示在堆栈跟踪中。

在 Windwos 71 上运行应用程序时,Process Explorer 会显示我想要分析的部件的正确堆栈跟踪。这是第 7 - 9 行中带有标记函数的堆栈跟踪:

自从我在 Windows 10 VM2 中安装了所有性能分析工具后,我开始在那里进行分析。首先要注意:Process Explorer 没有显示正确的堆栈跟踪。我实现的标记函数无处可寻。

尽管如此,我还是使用 UIforETWWindows Performance Recorder 记录了性能跟踪。在 WPA 中打开它们并专注于目标应用程序时,这是堆栈跟踪:

我感兴趣的所有信息都丢失了。堆栈显示为<Application>.exe!<Missing ImageId event>

我做错了什么?


如果这给你一个提示,这里是安装的相关软件:

1:Windows 7 计算机已安装 Visual Studio (C#)。

2:Windows 10 VM 没有 Visual Studio,但安装了 WinDBG(预览版)和 Windows Performance Toolkit。

我标记了,因为目标应用程序是用Delphi编写的。

【问题讨论】:

    标签: delphi windows delphi debugging windows-performance-analyzer


    【解决方案1】:

    Windows 10 WPA(以及 Windows 8.1,在较小程度上)放弃了对旧调试符号格式的支持;它现在只支持从 MSVC 7 开始成为标准的“RSDS”格式。使用旧符号文件格式的 PE 文件(例如,VB6 生成 NB10 PDB 文件)将导致“Missing ImageId event”错误。

    (消息本身在技术上不正确;即使在跟踪文件中也可能存在 ImageId,但它正在寻找一个 ImageId/DbgID_RSDS 事件,对于非 RSDS PDB 无法生成)

    【讨论】:

    • 如何克服<Missing ImageId event>
    • 使用 win 7(或可能 win 8.1)WPT 记录和查看跟踪,或使用诸如 TraceEvent 之类的 relogger 库为关注的图像注入虚假 RSDS 数据并修改 pdb 以获取匹配 RSDS 签名,或按照github.com/Zhentar/Wpa.Demystifier 的行编写一个 WPA 加载项,执行回退符号查找。
    【解决方案2】:

    <Missing ImageId event> 也将在会话未与“NT 内核记录器”合并时报告,该记录器提供解析符号所需的一些信息。

    停止会话的“正确”方法是:

    xperf.exe -stop my_trace -stop -d merged_trace.etl
    

    请注意,第二个-stop 必须停止另一个 会话(隐含“NT Kernel Logger”),而-d 则需要将两者合并到merged_trace.etl

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多