Как использовать gprof для профилирования процесса демона, не завершая его изящно? - PullRequest
4 голосов
/ 12 августа 2010

Нужно профилировать демона, написанного на C ++, gprof говорит, что нужно завершить процесс для получения gmon.out. Мне интересно, у кого-нибудь есть идеи получить gmon.out с помощью ctrl-c? Я хочу узнать горячую точку для цикла процессора

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

Нужно профилировать демона, написанного на C ++, gprof говорит, что нужно завершить процесс, чтобы получить gmon.out.

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

Мне интересно, у кого-нибудь есть идеи получить gmon.out с помощью ctrl-c?

Мне не известны такие варианты.

Хотя в случае gmon достаточно вызова exit() : если вы, например, намереваетесь протестировать, скажем, обработку 100K сообщений, вы можете добавить в код счетчик, увеличенный для каждого обработанного сообщения. Когда счетчик превысит лимит, просто позвоните exit().

Вы также можете попробовать добавить обработчик для какого-то неиспользуемого сигнала (например, SIGUSR1 или SIGUSR2) и вызвать exit() оттуда. Думаю, у меня нет личного опыта и я не могу быть уверен, что gmon будет работать правильно в этом случае.

Я хочу узнать горячую точку для цикла процессора

Моя обычная практика - создавать тестовое приложение, используя тот же исходный код, что и демон, но другой main(), где я моделирую точный сценарий (часто с переключением командной строки во многих сценариях), который мне нужно отладить или протестировать. Для этого я обычно создаю статическую библиотеку, содержащую весь модуль - за исключением файла с main() - и связываю тестовое приложение со статической библиотекой. (Это помогает поддерживать порядок в Makefiles.)

Я предпочитаю отдельное тестовое приложение для взлома внутри кода, так как особенно в случае тестирования производительности я могу иногда обходить или сокращать вызовы на дорогой ввод-вывод (или доступ к БД), который часто искажает выборку профилировщика и делает вывод бесполезным .

0 голосов
/ 25 августа 2010

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

Другой хороший вариант - RotateRight / Zoom .

0 голосов
/ 12 августа 2010

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

...