我有一个要使用Windows Performance Analyzer进行分析的应用程序。一切正常,但是我的应用程序没有任何合理的堆栈跟踪。
有问题的应用程序是演示应用程序。如果全部检查完,这会让我感觉很好。然后,我要分析另一个应用程序。由于我可以完全控制演示应用程序,因此我包含了一些标记功能,这些功能应该显示在堆栈跟踪中。
在Windwos 7 1 上运行应用程序时,Process Explorer会显示我要分析的零件的正确堆栈跟踪。这是第7-9行中带有标记功能的堆栈跟踪:
由于我在Windows 10 VM 2 中安装了所有性能分析工具,因此我开始在那里进行性能分析。首先要注意的是:Process Explorer没有显示正确的堆栈跟踪。我实现的标记功能无处可寻。
尽管如此,我还是使用 UIforETW 和 Windows 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编写的。
答案 0 :(得分:2)
Windows 10 WPA(以及Windows 8.1,在较小程度上)放弃了对较早调试符号格式的支持;它现在仅支持MSVC 7以来的标准“ RSDS”格式。使用较旧符号文件格式的PE文件(例如,VB6生成NB10 PDB文件)将导致“ Missing ImageId event”错误。
(消息本身在技术上是不正确的;即使在跟踪文件中也可能存在ImageId,但它正在查找ImageId / DbgID_RSDS事件,无法为非RSDS PDB生成该事件)
答案 1 :(得分:0)
<Missing ImageId event>
当会话没有与“NT Kernel Logger”合并时也会被报告,“NT Kernel Logger”提供了一些必要的信息来解析符号。
停止会话的“正确”方法是:
xperf.exe -stop my_trace -stop -d merged_trace.etl
请注意,第二个 -stop
需要停止另一个会话(隐式“NT Kernel Logger”),并且 -d
将两者合并到 merged_trace.etl
中。