трассировка вызовов xperf, специфичная для dll - PullRequest
1 голос
/ 14 января 2012

У меня проблемы с получением полных стеков вызовов с моими трассировками xperf.Это на 64-битном ПК с Win7.На более высоком уровне у меня есть exe, который загружает несколько библиотек, которые также выполняют основную часть работы.Все файлы pdb находятся в одном каталоге, и я получаю действительные символы и стеки вызовов в исполняемом коде, поэтому я почти уверен, что мой путь к символам настроен правильно.

Как только мой exe-вызов вызывает один иззагруженные dll, я теряю информацию стека вызовов, и в столбце стека отображается plugin_name.dll!?, который при раскрытии вызывает сам себя.Вкладка веса показывает высокий процент (50-90%) и большое количество, но я не могу получить какие-либо реальные вызовы функций для стека.Например:

Process, Stack, Module, Function, Weight, % Weight, Count, TimeStamp
,    |     kernel32.dll!BaseThreadInitThunk, , , 59067.075556, 73.29, 59075, 
,    |     |- plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 
,    |     |     plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 

Исходя из этого,

http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff191014(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ff191014.aspx

это указывает на то, что xperf

  • "... не знает, какой исполняемый образ находился по адресу"
  • "... Превышена максимальная глубина стека" .

Возможные причины для этого, которые я обнаружил, заключаются в том, что либо FPO (оптимизация указателя кадра) включена (я явно отключил с помощью / Oy, даже если они не должны быть включены)или превышена максимальная глубина стека, что я не знаю, как определить, что это я ударю или нет.

Не имея возможности увидеть, где время проводится в библиотеках, яЯ не могу получить очень много полезной информации, поэтому я хотел бы выяснить, что происходит.

У кого-нибудь есть какие-либо рекомендации по чтению или попытке?Есть ли какие-то ограничения в стеке, которые мне не хватает?Существуют ли специальные настройки для символов, специфичные для стеков вызовов в dll?

Ответы [ 3 ]

2 голосов
/ 08 августа 2018

В основном проблема с загрузкой символов возникает из-за несовпадения библиотеки отладчика и сервера символов.

Установите последнюю версию SDK, содержащую комплект производительности Windows, и запустите wpa / xperf из той же директории, чтобы решить проблему с загрузкой символов. Я предполагаю, что путь к серверу символов правильный. Используйте procxp.exe, чтобы увидеть версию dbghelp.dll и symsrv.dll, а также путь, чтобы увидеть, что xperf или любой инструмент из каталога указывает на последнюю доступную или поставленную версию вышеупомянутых dll.

Спасибо, SushantB

0 голосов
/ 06 августа 2013

создайте новый envvar DBGHELP , установите для него 1 . Теперь создайте envvar DBGHELP_LOG и установите для него файл журнала, например D: \ DbgHelpLog.txt . После завершения загрузки символов закройте xperfview / wpa и посмотрите в журнале, почему загрузка символов не удалась.

Диагностика загрузки символа DBGHELP

http://blogs.msdn.com/b/matt_pietrek/archive/2005/04/12/407721.aspx

0 голосов
/ 23 октября 2012

Попробуйте следующее, из здесь : Отключить Paging Executive

Чтобы трассировка работала в 64-битной Windows, вам нужно установить раздел реестра DisablePagingExecutive.Это заставляет операционную систему не пейджировать драйверы режима ядра и системный код на диск, что является необходимым условием для получения стеков 64-битных вызовов с использованием xperf, потому что обход 64-битного стека зависит от метаданных в исполняемых образах, а в некоторых ситуацияхКоду обхода стека xperf не разрешается касаться страниц.Выполнение следующей команды из командной строки с повышенными привилегиями установит этот раздел реестра для вас.

REG ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f

После установки этого ключа реестра вам потребуется перезагрузить систему, прежде чем вы сможете записывать стеки вызовов.Установка этого флага означает, что ядро ​​Windows блокирует больше страниц в ОЗУ, поэтому, вероятно, это потребует около 10 МБ дополнительной физической памяти.

...