GDB поддерживает "выборку во время выполнения" или есть пользовательское "расширение", которое делает это - PullRequest
6 голосов
/ 02 сентября 2011

Мотивация: я не могу заставить профилировщик gpu cpu работать на компьютере, на котором выполняется код (своим последним вздохом я проклинаю libunwind :)), поэтому мне было интересно, поддерживает ли gdb высокочастотную случайную приостановку выполнения программы, сохраняя имяфункции, в которой произошел разрыв, и подсчет того, сколько раз он приостановился в функции x.Это то, что я бы назвал «выборкой во время выполнения», возможно, есть более точное / умное имя.Я посмотрел на oprofile, но это сложно: а) выяснить, может ли он это сделать; б) выяснить, как это сделать. РЕДАКТИРОВАТЬ: очевидно правильное имя: "метод статистической выборки"

РЕДАКТИРОВАТЬ2:Причина, по которой я предлагаю вознаграждение за это, состоит в том, что я вижу некоторых людей на SO, которые рекомендуют делать ручной перерыв 10-20x и проверять стек с помощью bt ... Кажется очень расточительным, когда дело доходит до времени, поэтому я догадываюсь, что некоторые умные люди автоматизировали его.:)
EDIT3: gprof не обрежет его ... я недавно пытался запустить его в системе ARM, и вывод был мусор ... :( Я думаю, что его проблемы с многопоточностью являются причиной этого ...

Ответы [ 2 ]

3 голосов
/ 21 января 2013

GDB не справился бы с этим хорошо, хотя вы наверняка могли бы взломать что-то, что дало бы крайне неточные результаты.

Я бы предложил плагин Valgrind "Callgrind".В качестве бонуса он не требует абсолютно никакой перекомпиляции или других специальных настроек.Все, что вам нужно, это установить в вашей системе valgrind и отладить информацию в вашей программе (или, по крайней мере, полную символьную информацию; я не уверен).

Затем вы вызываете свою программу следующим образом:

valgrind --tool=callgrind <your program command line>

Когда это будет сделано, в текущем каталоге появится имя файла callgrind.out.<pid>.Вы можете прочитать и визуализировать этот файл с помощью очень приятного графического инструмента под названием kcachegrind (обычно его нужно устанавливать отдельно).

Единственная проблема заключается в том, что, поскольку callgrind слегка замедляет выполнение вашей программы,время, затрачиваемое на системные вызовы, может оказаться меньше (в процентах), чем на самом деле.По умолчанию callgrind не включает системное время в свои счетчики, поэтому значения, которые он вам дает, представляют собой реальное сравнение кода в вашей программе, если не фактическое время «под» этой функцией.Сначала это может сбить с толку, поэтому, если это произойдет, попробуйте добавить --collect-systime=yes.

Я не уверен, каким может быть состояние callgrind в ARM.ARMv7 указан в качестве поддерживаемой платформы , но говорит только «довольно полный», что бы это ни значило.

3 голосов
/ 02 сентября 2011

Вы можете вручную выполнить выборку в GDB, приостановив ее во время выполнения.

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

  • Высокая частота выборки не помогает.

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

Если вы перейдете по этой ссылке, вы увидите причины и указания, как это сделать успешно.

...