Сохранение gmon.out перед убийством процесса
Я хотел бы использовать gprof для профиля демона. Мой демон использует стороннюю библиотеку, с которой он регистрирует некоторые обратные вызовы, а затем вызывает функцию main
, которая никогда не возвращается. Мне нужно вызвать kill
(либо SIGTERM, либо SIGKILL), чтобы завершить демон. К сожалению, на странице руководства gprof указано следующее:
Профилированная программа должна вызывать "exit" (2) или нормально возвращаться для профилирующая информация должна быть сохранена в файле gmon.out.
Есть ли способ сохранить информацию профилирования для процессов, которые были убиты с помощью SIGTERM или SIGKILL?
Ответы
Ответ 1
Во-первых, я хотел бы поблагодарить @wallyk за то, что он дал мне хорошие начальные указатели. Я решил свой вопрос следующим образом. По-видимому, обработчик выхода libc gprof называется _mcleanup
. Итак, я зарегистрировал обработчик сигналов для SIGUSR1 (не использовался сторонней библиотекой) и назвал _mcleanup
и _exit
. Работает отлично! Код выглядит следующим образом:
#include <dlfcn.h>
#include <stdio.h>
#include <unistd.h>
void sigUsr1Handler(int sig)
{
fprintf(stderr, "Exiting on SIGUSR1\n");
void (*_mcleanup)(void);
_mcleanup = (void (*)(void))dlsym(RTLD_DEFAULT, "_mcleanup");
if (_mcleanup == NULL)
fprintf(stderr, "Unable to find gprof exit hook\n");
else _mcleanup();
_exit(0);
}
int main(int argc, char* argv[])
{
signal(SIGUSR1, sigUsr1Handler);
neverReturningLibraryFunction();
}
Ответ 2
Вы можете добавить обработчик сигнала для сигнала, который сторонняя библиотека не улавливает или игнорирует. Вероятно, SIGUSR1 достаточно хорош, но придется либо экспериментировать, либо читать библиотечную документацию &mdash, если она достаточно полная.
Ваш обработчик сигнала может просто вызвать exit()
.