Проблема с получением xperfview для загрузки символов для DLL - PullRequest
1 голос
/ 22 декабря 2011

Я боролся изо всех сил с xperf, чтобы получить символы для инструмента, который я профилирую. Мой код, который запускается в инструменте, разделен между .exe и .dll - важные вещи для профилирования находятся в .dll. Я запустил xperf:

xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE -stackwalk profile

А потом я немного запустил свой инструмент, а затем

xperf -d profile.etl

Тогда я попробовал xperfview. Я загрузил профиль, включил «загрузить символы» и открыл сводную таблицу. Нет символов вообще - буквально модуль появился «неизвестно» в столбце функции. Я просмотрел другие темы по этому поводу и вот что я попробовал:

  1. Я установил переменные среды _NT_SYMBOL_PATH и _NT_SYMCACHE
  2. Я очистил свой кэш символов и запустил xperf -symbols -i profile_results.etl.
  3. Я скопировал файл dbghelp.dll из последней версии средств отладки Windows и повторил вышеописанное.

После всего этого я теперь получаю имена функций, которые отображаются правильно для большинства модулей, которые не мой собственный код, но я не могу заставить мою dll отображаться. DLL компилируется в режиме релиза (с оптимизацией), но я специально настроил проект Visual Studio для создания pdb, я убедился, что pdb существует и находится в каталоге на моем _NT_SYMBOL_PATH. Кто-нибудь знает, как я могу это исправить или хотя бы отладить дальше?

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Вы можете установить некоторые переменные среды , чтобы включить ведение журнала диагностики во время загрузки символов:

  • DBGHELP_DBGOUT = 1
  • DBGHELP_LOG = C: \ dbghelp.log
1 голос
/ 01 июня 2016

Я только что столкнулся с той же проблемой ... попробовал все те же шаги ... просмотрел все (по-видимому) похожие советы ...

Кроме того, я попытался запустить symchk, используя тот же dbghelp.dll / symsrv.dll DLL, которые я скопировал в папку «bin» моего WPA, чтобы убедиться, что моя PDB доступна.(все еще думая, что я схожу с ума ...)

Я должен заметить: мое значение _NT_SYMBOL_PATH содержало серверы с кешем lcl и прямыми локальными расположениями: _NT_SYMBOL_PATH=srv*D:\SymbolCache*http://msdl.microsoft.com/download/symbols;D:\GitHub\....

Затем до него дошломне, что моя DLL, используемая моим "партнерским" EXE, загружается динамически через LoadLibrary () / GetProcAddress () ... это может быть проблемой для XPerf ?????

Я колебался, даже пытаясь это ...

Я добавил бесполезный экспорт в мою DLL, и я вызываю его прямо в EXE (чтобы вызвать запись таблицы импорта для моей DLL) Так что теперь EXE зависит от DLL, чтобы даже загрузить.

Получается ...

............. затем XPerf загрузил все символы :).

Редактировать : Я только что нашел этот URL на MSDN, где кто-то опубликовал код в '11, который демонстрирует аналогичную (такую ​​же?) Проблему

EDIT :

Я недавно обсуждал это с коллегой и узнал, что XPerf правильно "решит" загрузить символы для DLL, загруженных программно.cally ... IF DLL остается загруженной до завершения процесса.

Таким образом, для библиотек DLL, которые загружаются и выгружаются во время выполнения и выгружаются при завершении ... XPerfпропустит попытку загрузить эти символы.

0 голосов
/ 13 декабря 2013

Попробуйте использовать wpa вместо xperfview. Он использует ту же систему для загрузки символов, что и xperfview, но также имеет диагностическую консоль, которая позволяет просматривать сообщения о загрузке символов, которые могут быть полезны.

Кроме того, вы должны сообщить нам, что у вас установлено _NT_SYMBOL_PATH. Есть много способов, которые могут быть неправильно установлены.

Кроме того, в _NT_SYMBOL_PATH вы должны указать локальный кеш для ваших файлов PDB - тогда вы можете проверить, скопированы ли ваши PDB в локальный кеш.

Вы также можете просмотреть путь SymCache (на который указывает _NT_SYMCACHE_PATH, по умолчанию c: \ symcache), где хранятся файлы WPT .symcache. Файлы PDB преобразуются в этот формат, а файлы .symcache - это то, что в конечном итоге загружается WPA и xperfview.

Для получения дополнительной информации см .:

http://randomascii.wordpress.com/2012/10/04/xperf-symbol-loading-pitfalls/

0 голосов
/ 10 января 2012

Я не уверен, поможет ли это, но вот еще одна деталь, с которой я столкнулся сегодня, помимо вопросов и ответов на xperf не может загрузить символы моей DLL :

Для меня xperfview не нравятся файлы PDB на подключенных сетевых дисках: поскольку я запускал xperf и xperfview на другом компьютере, на котором был создан код, я получал как исполняемые файлы, так и файлы PDB из общей сетевой папки, что Я сопоставил букву диска, чтобы воссоздать точно такие же абсолютные пути, что и на сборочной машине - не повезло. Даже добавление папки с файлами PDB в путь символов не помогло.

Все заработало как положено, когда я убедился, что файл .pdb находится в локальной папке.

...