2012-04-18 13 views
18

Ich möchte gprof verwenden, um einen Daemon zu profilieren. Mein Daemon verwendet eine 3rd-Party-Bibliothek, mit der er einige Callbacks registriert, und ruft dann eine main-Funktion auf, die nie zurückkehrt. Ich muss kill (entweder SIGTERM oder SIGKILL) aufrufen, um den Daemon zu beenden. Leider sagt gprof Anleitung Seite folgendes:Speichern von gmon.out vor dem Löschen eines Prozesses

Das Programm mit Profil aufrufen müssen „exit“ (2) oder die normalerweise für die Profilinformationen Rückkehr in die gmon.out Datei gespeichert werden.

Gibt es eine Möglichkeit Profilinformationen für Prozesse zu speichern, die mit SIGTERM oder SIGKILL gelöscht werden?

Antwort

24

Zuerst möchte ich @wallyk dafür danken, dass sie mir gute Anfangshinweise gegeben hat. Ich habe mein Problem wie folgt gelöst. Offenbar heißt der Gprof-Exit-Handler von libc _mcleanup. Also habe ich einen Signalhandler für SIGUSR1 registriert (der von der 3rd Party Library nicht benutzt wurde) und _mcleanup und _exit genannt. Funktioniert perfekt! Der Code sieht folgendermaßen aus:

#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

Sie müssen dem Compiler und Linker auch einige Flags hinzufügen. Für g ++ solltest du folgendes verwenden: -Wl, - no-as-needed -ldl -pg. Quelle: http://stackoverflow.com/questions/20369672/undefined-reference-to-dlsym – rkioji

6

Sie könnten einen Signal-Handler für ein Signal hinzufügen, das die Third-Party-Bibliothek nicht abfängt oder ignoriert. Wahrscheinlich ist SIGUSR1 gut genug, muss aber entweder experimentieren oder die Dokumentation der Bibliothek lesen —, wenn es gründlich genug ist.

Ihr Signalhandler kann einfach exit() anrufen.

+0

Schöne Antwort, aber es löst nicht wirklich mein Problem. Die 3rd Party Library verwendet Omnithread und enthält während der Ausführung einen Mutex. Omnithread scheint etwas mit atexit zu registrieren, denn ich bekomme 'terminate called nachdem ich eine Instanz von 'omni_thread_fatal' geworfen habe. Der Prozess-Core-Dumps, ohne gmon.out. Kann ich gprofs atexit() Hook nicht direkt aufrufen? – user1202136

Verwandte Themen