Поддержка компиляторами профилирования и отладки кода
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.05.20 05:28
Оценка: 5 (1)
Профилирование кода обычно делается, как известно, методом Монте-Карло, который позволяет оценить распределение нагрузки с точностью до периода таймерного прерывания. Периодичность порядка 1 мс дает хорошие результаты для типового кода, но для программ, обрабатывающих тысячи событий в секунду, требуется сильное уменьшение периода, а это и дает большие накладные расходы, и портит результат. Кроме того, такой метод часто неприменим для профилирования низкоуровневого кода — тех же обработчиков прерываний, процедур планировщика ОС и т.п.

При отладке нередко требуется история вызовов функций, которую приходится формировать вручную, включая в каждую функцию отладочные вызовы. Это и утомительно, и чревато ошибками (забыли вставить вызов, вызвали неправильно и т.п.).

В MS VC++ уже очень давно поддерживается автоматическая вставка вызова служебной функции _penter при входе в каждую функцию (/Gh) и _pexit — при выходе (/GH). По идее, фича чертовски мощная, но, как и многое другое у MS, реализована столь же чертовски убого — функцию, вызвавшую _penter/_pexit, можно определить только по адресу возврата, для этого нужно или каждый раз лезть в общую базу данных, или тупо складывать все вызовы в общий лог. Доступ к базе — сильные тормоза, синхронизация доступа к логу — тоже тормоза.

По уму, им достаточно было приделать к этому автоматическое создание компилятором дескриптора функции, содержащего ее адрес, сигнатуру и хотя бы одно поле для произвольных данных, где можно было бы хранить счетчик использования, время работы или указатель на расширенный дескриптор, и передавать адрес этого дескриптора в _penter/_pexit. С помощью этого механизма удалось бы очень эффективно и экономично профилировать их собственное ядро, убирая основные тормоза сразу, а не через годы жалоб на них.

В каких-нибудь других реализациях C/C++ компиляторы поддерживают разумные средства профилирования/отладки?
профилирование profiling отладка debug _penter _pexit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.