Оптимизация производительности при ходьбе по стеку

В настоящее время я использую библиотеку dbghelp, чтобы пройтись по стеку потока некоторого процесса (используя GetThreadContext() и StackWalk64()) и собирать только адреса возврата, содержащиеся в каждом кадре.

Тем не менее, накладные расходы на это слишком велики для системных требований - общее время составляет apx. 5 мсек на стековую прогулку (с 10-15 кадрами). На этот раз включает GetThreadContext() и цикл, который вызывает StackWalk64() для получения всех кадров.

Во всяком случае, я должен найти способ сделать это намного быстрее. У кого-нибудь есть идеи, как я могу это сделать?


Редактировать:

Кто-нибудь знает механизм ETW (Event Tracing for Windows)?

Если так, как я могу отследить все переключения контекста, которые произошли в определенный период времени? Есть ли поставщик событий, который публикует событие при каждом переключении контекста?

3 ответа

Самый быстрый способ, который я могу придумать, - это создать свою собственную версию GetThreadContext а также StackWalk64 путем создания драйвера ядра, который захватывает kernelStack поле ETHREAD Структура потока, который вы пытаетесь контролировать. Вот хорошая статья на эту тему.

Если у вас Windows Vista или выше, вы должны использовать ETW, точка. Вы можете активировать все, о чем вы говорите, включая переключение контекста и события Sample Profile, и это довольно эффективно. Для X86 это, в основном, обход цепочки регистров EBP, представляющей собой связанный список адресов, по которым он должен перебираться. В 64-битной среде стековый обходчик должен разматывать стек, и поэтому он немного менее эффективен, но я могу сказать, что если вы выполняете какую-то разумную работу в своем приложении, эффекты стекового обхода не будут проявляться вверх. Это, конечно, не в миллисекундном диапазоне.

Часть ETW на самом деле является независимым вопросом. Средства анализа производительности Windows могут захватывать все переключатели контекста, а также Visual Studio Profiler в режиме "Профилирование параллелизма ресурсов". Вы также можете сбросить все события в файл вручную, используя logman, см. Инструкции здесь.

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