Wie starte ich gdb gegen einen Daemon im Hintergrund?

7

Ich versuche einen Server zu debuggen, den ich mit gdb geschrieben habe, da er unter sehr speziellen und seltenen Bedingungen segrediert.

Gibt es eine Möglichkeit, gdb im Hintergrund laufen zu lassen (im stillen oder im Batch-Modus?), Kindern zu folgen (da mein Server ein Daemon ist und sich von der Haupt-PID trennt) und automatisch den Core und das Backtrace (zu eine designierte Datei) sobald das Programm abstürzt?

    
David Titarenco 12.01.2010, 17:05
quelle

6 Antworten

6

Warum führen Sie den Prozess nicht einfach interaktiv in einer persistenten Bildschirmsitzung aus? Warum muss es beim Debugging ein Daemon sein? Oder führen Sie einfach gdb in der Bildschirmsitzung aus und hängen Sie es an den laufenden Prozess an (z. B. gdb / pfad / an / binary -p PID_of_binary), nachdem es sich verzweigt hat.

    
Andy Ross 12.01.2010, 19:23
quelle
7

Wenn Sie die entsprechenden Berechtigungen haben, können Sie gdb jedem Prozess beifügen. Sie können dies in der Befehlszeile mit:

tun %Vor%

oder aus gdb mit dem Befehl attach:

%Vor%

Sobald also Ihr Daemon gestartet ist, können Sie eine dieser beiden Techniken verwenden, um sich an die letzte PID anzuhängen, mit der Ihr Daemon läuft. Durch das Anhängen von gdb wird der Prozess gestoppt, den Sie verfolgen. Daher müssen Sie "continue" eingeben, um es neu zu starten.

Ich kenne keinen direkten Weg, um gdb dazu zu bringen, beliebige Befehle auszuführen, wenn das Programm abstürzt. Hier ist eine Problemumgehung, die ich mir vorstellen kann:

  1. Erstellen und registrieren Sie Signalhandler für SIGSEGV.
  2. Sagen Sie gdb, dass Sie dieses Signal nicht anhalten sollen ( handle SIGSEGV nostop )
  3. Setzen Sie einen Haltepunkt in der ersten Zeile Ihres Signalhandlers.
  4. Weisen Sie Befehle zum Haltepunkt von Schritt 3
R Samuel Klatchko 12.01.2010 19:45
quelle
3

Zuerst habe ich Ihre Shell / Umgebung eingerichtet, um Ihnen einen Core-Dump zu geben. In bash:

%Vor%

Sobald Sie den Core-Dump haben, können Sie mit gdb den Stack-Trace untersuchen:

%Vor%     
Kaleb Pederson 12.01.2010 17:15
quelle
2

Wie erzeuge ich einen Stacktrace, wenn meine gcc C ++ app stürzt ab Antwort für diese Frage sollte tun, was Sie wollen. (vorausgesetzt, Sie können Änderungen in Ihrem Code vornehmen)

    
rgngl 12.01.2010 17:13
quelle
1

Ich bin nicht wirklich ein gdb-Experte, aber zwei Dinge kommen mir in den Sinn

  1. Tracepoints , die Ihnen möglicherweise die notwendigen Informationen geben, während Ihr Programm läuft oder
  2. Benutze gdb's Remote Debugging , um dein Programm zu debuggen, solange es noch ist läuft als ein Daemon.
Noufal Ibrahim 12.01.2010 17:11
quelle
1

Vielleicht möchten Sie sich ansehen, wie Samba das Debuggen erleichtert; Es hat eine konfigurierbare "Panikaktion" , die kann suspendieren Sie die Anwendung, benachrichtigen Sie den Entwickler, spawn gdb, etc., und wird als Teil seiner Signal-Handler ausgeführt. Siehe lib / util / fault.c im Samba-Quellbaum.

    
Josh Kelley 12.01.2010 21:46
quelle

Tags und Links