Анализатор производительности Windows отсутствует событие ImageId
У меня есть приложение, которое я хочу профилировать с помощью анализатора производительности Windows. Все это работает, но я не получаю никаких разумных следов стека от моего приложения.
Рассматриваемое приложение является демонстрационным приложением. Это должно дать мне хорошее чувство, если все проверят. Затем я хочу профилировать другое приложение. Так как у меня есть полный контроль над моим демонстрационным приложением, я включил некоторые функции маркеров, которые должны отображаться в трассировке стека.
При запуске приложения в 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 (Preview) и Windows Performance Toolkit.
Я пометил Delphi, потому что целевое приложение написано на Delphi.
2 ответа
Windows 10 WPA (а также Windows 8.1, в меньшей степени) отказались от поддержки старых форматов символов отладки; теперь он поддерживает только формат "RSDS", который был стандартным со времени MSVC 7. PE-файлы, использующие более старые форматы файлов символов (например, VB6 генерирует файлы NB10 PDB), приведут к этой ошибке "Отсутствует событие ImageId".
(Само сообщение технически неверно; вероятно, даже в файле трассировки есть ImageId, но оно ищет событие ImageId/DbgID_RSDS, которое не может быть сгенерировано для PDB не-RSDS)
<Missing ImageId event>
также будет сообщено, когда сеанс не объединен с "NT Kernel Logger", который предоставляет некоторую информацию, необходимую для разрешения символов.
«Правильный» способ остановить сеанс:
xperf.exe -stop my_trace -stop -d merged_trace.etl
Обратите внимание, что второй
-stop
если необходимо остановить другой сеанс (неявно "NT Kernel Logger"), и
-d
объединить оба в
merged_trace.etl
.