У меня проблемы с получением полных стеков вызовов с моими трассировками 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?