2012-04-18 11 views
18

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

El programa perfilado debe llamar "salida" (2) o devolver normalmente para la información de perfil que se guarda en el archivo gmon.out.

¿Hay alguna forma de guardar información de perfiles para procesos que se destruyen con SIGTERM o SIGKILL?

Respuesta

24

En primer lugar, me gustaría agradecer a @wallyk por darme buenos consejos iniciales. Resolví mi problema de la siguiente manera. Aparentemente, el manejador de salida gprof de libc se llama _mcleanup. Entonces, registré un manejador de señal para SIGUSR1 (no utilizado por la biblioteca de terceros) y llamé al _mcleanup y al _exit. ¡Funciona perfectamente! El código se ve de la siguiente manera:

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

También necesita agregar algunos indicadores al compilador y al enlazador. Para g ++ debe usar: -Wl, - no-as-needed -ldl -pg. Fuente: http://stackoverflow.com/questions/20369672/undefined-reference-to-dlsym – rkioji

6

Puede agregar un manejador de señal para una señal que la biblioteca de terceros no detecta o ignora. Probablemente SIGUSR1 es lo suficientemente bueno, pero tendrá que experimentar o leer la documentación de la biblioteca — si es lo suficientemente minuciosa.

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

+0

Una respuesta agradable, pero en realidad no resuelve mi problema. La biblioteca de terceros utiliza omnithread y contiene un mutex durante la ejecución. omnithread parece registrar algo usando atexit, porque recibo 'terminar llamado después de lanzar una instancia de 'omni_thread_fatal''. El núcleo de proceso se vuelca, sin gmon.out. ¿No puedo llamar al gancho de atexit() de gprof directamente? – user1202136

Cuestiones relacionadas