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?
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.
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:
handle SIGSEGV nostop
) 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%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)
Ich bin nicht wirklich ein gdb-Experte, aber zwei Dinge kommen mir in den Sinn
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.