xperf не может загрузить символы моей DLL

Я пытаюсь использовать xperf для профилирования моей DLL, но он отказывается использовать PDB-файл моей DLL. Запустив xperf на.etl с -symbols, я получаю:

DBGHELP: mydll- private symbols & lines
         C:\mydll\debugu\mydll.pdb - unmatched

Что заставляет меня верить, что он думает, что мой PDB не соответствует DLL, используемой приложением. Это не верно; это соответствует. Я подтвердил путь к DLL, с которой связывается приложение, используя procxp, полностью перестроил проект и так далее. Это все еще думает, что это не соответствует.

Есть идеи, что может быть не так?

3 ответа

Решение

Извините, я задал этот вопрос и забыл об этом.

На самом деле были две проблемы.

Во-первых, xperf фактически использовал более старую кэшированную версию моих символов. Это было исправлено удалением из кеша символов.

Во-вторых, когда я загружал символы в xperfview, он фактически не помещал мою современную pdb в кэш символов. Однако pdb находился в каталоге, который, как я подтвердил, был включен в переменную _NT_SYMBOL_PATH. К сожалению, я не помню точную команду, использованную для исправления этого, но я считаю, что это был вариант 'xperf file.etl -symbols'. Эта команда правильно проанализировала etl и загрузила / кэшировала все соответствующие символы так, как встретила их. После этого xperfview мог правильно показывать мои символы.

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

Попробуйте установить переменную среды SYSTEM _NT_SYMBOL_PATH, чтобы она указывала на ваш файл.pdb _NT_SYMCACHE_PATH, чтобы он указывал на c:\Symbols. См. Документы по обработке символов XPerf по http://msdn.microsoft.com/en-us/library/ff191023(VS.85).aspx

На WindowsItPro dot com есть хорошая статья в блоге под названием "Под прикрытием с XPerf", в которой рассказывается о передаче символов в XPerf.

Обратите внимание, что мне нужно было установить системную переменную среды с правильными значениями, установка среды в пакетном файле не была подхвачена xperfview (проверьте параметр меню "Трассировка, Настройка пути к символам" сразу после запуска XPerfView)

Я только что опубликовал ответ на аналогичный вопрос о SO, который может быть связан с проблемой, возникшей здесь...

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

Лично я предполагаю, что речь идет о логике в XPerf, решающей, стоит ли вообще пытаться загрузить символы для данного модуля. например, "загрузить все EXE-файлы и их записи IAT" (что будет пропускать все динамические DLL-файлы - что, похоже, не так, но происходит нечто подобное)

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

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

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

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