Подтвердить что ты не робот

Сохранение gmon.out перед убийством процесса

Я хотел бы использовать gprof для профиля демона. Мой демон использует стороннюю библиотеку, с которой он регистрирует некоторые обратные вызовы, а затем вызывает функцию main, которая никогда не возвращается. Мне нужно вызвать kill (либо SIGTERM, либо SIGKILL), чтобы завершить демон. К сожалению, на странице руководства gprof указано следующее:

Профилированная программа должна вызывать "exit" (2) или нормально возвращаться для профилирующая информация должна быть сохранена в файле gmon.out.

Есть ли способ сохранить информацию профилирования для процессов, которые были убиты с помощью SIGTERM или SIGKILL?

4b9b3361

Ответ 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().