Анализатор производительности Windows отсутствует событие ImageId

У меня есть приложение, которое я хочу профилировать с помощью анализатора производительности Windows. Все это работает, но я не получаю никаких разумных следов стека от моего приложения.

Рассматриваемое приложение является демонстрационным приложением. Это должно дать мне хорошее чувство, если все проверят. Затем я хочу профилировать другое приложение. Так как у меня есть полный контроль над моим демонстрационным приложением, я включил некоторые функции маркеров, которые должны отображаться в трассировке стека.

При запуске приложения в Windwos 7 1 Process Explorer показывает правильную трассировку стека для детали, которую я хочу профилировать. Вот трассировка стека с функциями маркера в строках 7 - 9:

Трассировка стека в проводнике процессов

Поскольку я установил все инструменты анализа производительности в Windows 10 VM 2, я начал там профилирование. Первое, на что нужно обратить внимание: Process Explorer не показывает правильную трассировку стека. Функции маркера, которые я реализовал, нигде не найдены.

Тем не менее, я записал данные о производительности, используя UIforETW и Windows Performance Recorder. Когда они открываются в WPA и фокусируются на целевом приложении, это трассировка стека:

Трассировка стека 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.

Другие вопросы по тегам