Проблема с получением xperfview для загрузки символов для DLL

Я боролся изо всех сил с 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 ответа

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

  • DBGHELP_DBGOUT = 1
  • DBGHELP_LOG = C: \ dbghelp.log

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

Кроме того, я попытался запустить 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 году, который демонстрирует аналогичную (та же проблема?)

РЕДАКТИРОВАТЬ:

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

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

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

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

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

Попробуйте использовать 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/

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