Enregistrer gmon.out avant de tuer un processus

Je voudrais utiliser gprof pour profiler un démon. Mon démon utilise une bibliothèque tierce, avec laquelle il enregistre certains rappels, puis appelle une fonction main , qui ne revient jamais. Je dois appeler kill (SIGTERM ou SIGKILL) pour terminer le démon. Malheureusement, la page de manuel de gprof indique ce qui suit:

Le programme profilé doit appeler “exit” (2) ou retourner normalement pour que les informations de profilage soient enregistrées dans le fichier gmon.out.

Est-il possible de sauvegarder les informations de profilage pour les processus qui sont tués avec SIGTERM ou SIGKILL?

    Tout d’abord, je voudrais remercier @wallyk de m’avoir donné de bons conseils initiaux. J’ai résolu mon problème comme suit. Apparemment, le gestionnaire de sortie gprof de libc s’appelle _mcleanup . J’ai donc enregistré un gestionnaire de signal pour SIGUSR1 (non utilisé par la bibliothèque tierce) et appelé _mcleanup et _exit . Fonctionne parfaitement! Le code ressemble à ceci:

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

    Vous pouvez append un gestionnaire de signal pour un signal que la bibliothèque tierce ne détecte pas ou ignore. SIGUSR1 est probablement assez bon, mais il faudra soit expérimenter, soit lire la documentation de la bibliothèque si elle est suffisamment approfondie.

    Votre gestionnaire de signal peut simplement appeler exit() .