ver terminar saber procesos proceso matar los eliminar corriendo como comando linux gprof

linux - terminar - Guardando gmon.out antes de matar un proceso



terminar proceso en terminal linux (2)

Me gustaría usar gprof para perfilar un demonio. Mi demonio usa una biblioteca de terceros, con la que registra algunas devoluciones de llamada, luego llama a una función main , que nunca regresa. Necesito llamar a kill (SIGTERM o SIGKILL) para terminar el daemon. Desafortunadamente, la página del manual de gprof dice lo siguiente:

El programa perfilado debe llamar a "exit" (2) o volver normalmente para que la información del perfil se guarde en el archivo gmon.out.

¿Hay alguna forma de guardar la información de perfil para los procesos que se eliminan con SIGTERM o SIGKILL?


Podría agregar un controlador de señal para una señal que la biblioteca de terceros no detecte o ignore. Probablemente SIGUSR1 sea lo suficientemente bueno, pero tendrá que experimentar o leer la documentación de la biblioteca, si es lo suficientemente exhaustivo.

Su manejador de señal puede simplemente llamar a exit() .


Primero, me gustaría agradecer a @wallyk por darme buenos consejos iniciales. Resolví mi problema de la siguiente manera. Aparentemente, el controlador de salida gprof de libc se llama _mcleanup . Por lo tanto, _mcleanup un controlador de señales para SIGUSR1 (no utilizado por la biblioteca de terceros) y llamé a _mcleanup y _exit . ¡Funciona perfectamente! El código se ve como sigue:

#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(); }