Проблема с получением xperfview для загрузки символов для DLL
Я боролся изо всех сил с xperf, чтобы получить символы для инструмента, который я профилирую. Мой код, который запускается в инструменте, разделен между.exe и.dll - важные вещи для профилирования находятся в.dll. Я запустил xperf:
xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE -stackwalk profile
А потом я немного запустил свой инструмент, а затем
xperf -d profile.etl
Тогда я попробовал xperfview. Я загрузил профиль, включил "загрузить символы" и открыл сводную таблицу. Никаких символов - буквально модуль появился "неизвестно" в столбце функции. Я просмотрел другие темы по этому поводу и вот что я попробовал:
- Я установил свои переменные окружения, _NT_SYMBOL_PATH и _NT_SYMCACHE
- Я очистил свой кэш символов и запустил xperf -symbols -i profile_results.etl.
- Я скопировал файл 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/