Ich habe ein Apache-Modul unter Mac OS X, das zufällige Abstürze erzeugt. Ich kann diese Abstürze mit einer bestimmten Abfolge von Aktionen reproduzieren, und diese Abstürze erzeugen den Crash Reporter Dialog "httpd quit expiredly". Gibt es eine Möglichkeit, Crash Reporter Debugger starten zu lassen (xcode, gdb, irgendetwas) anstatt nur die Backtrace anzuzeigen?
Ich habe versucht, httpd
unter gdb
mit httpd -X
auszuführen, aber der Absturz passiert dann nicht - es passiert nur, wenn viele httpds gleichzeitig laufen, und ich fand keine Möglichkeit, gdb an alle anzuhängen sie sofort. Ich hatte also gehofft, ich könnte CrashReporter veranlassen, den Debugger anzuhängen, wenn ein bestimmter Prozess abstürzt - gibt es eine Möglichkeit dazu?
Leider hat die Art von Fehler, die Sie beschreiben, eine Tendenz zu verschwinden, wenn sie durch die Untersuchung gestört wird.
Eine Option zum Ausprobieren besteht darin, eine GDB-Sitzung von Ihrem Modul aus zu starten. QA1573 hat ein Beispiel mit DTrace, das etwas sauberer erscheint, aber nach einigen Experimentieren scheint dies bei mehreren Prozessen nicht besonders gut zu funktionieren. (Ich konnte keine Möglichkeit sehen, DTrace zu veranlassen, gdb
anzuhängen, wenn der Prozess abstürzt; Sie erhalten nur eine proc::postsig:signal-handle
-Sonde, die ausgelöst wird, nachdem der Prozess bereits abgestürzt ist.)
Sie könnten so etwas in Ihrem Modul tun:
%Vor% würde ein separates Terminal-Fenster für jeden httpd
Prozess öffnen.
Sie könnten stattdessen auch gdb
von außerhalb starten, mit einem Skript (DTrace oder anderen) nach httpd
-Prozessen suchen und die SIGSTOP
-Methode von QA1573 in Ihrem Modulcode verwenden, um zu warten, bis das Skript das neue bemerkt hat httpd
.
Nach ein paar Monaten können wir sagen, dass die Antwort nein ist, du kannst nicht . :)
Um Ihr Problem zu beheben, sollte der Absturzbericht auswertbar sein ... aber wenn nicht, versuchen Sie möglicherweise, das Apache-Fehlerprotokoll und auch Ihren eigenen Protokollierungscode zu aktivieren. Dann hilft das Überwachen von Protokollen / Konsole, wenn ein Absturz auftritt.
Dies ist weder nach meinem besten Wissen noch nach Google-Fu möglich, noch würde es einen Sinn ergeben. Dies ist unabhängig von CrashReporter
nicht möglich, da Ihr Programm zum Zeitpunkt der Ausführung bereits abgebrochen wurde.
Es ist jedoch möglich, GDB
nachträglich zu verwenden, indem Sie httpd
dazu veranlassen, Core Dumps zu erzeugen, wenn ein Prozess den Bucket startet. Die eigene Dokumentation von Apache zum Debuggen von Abstürzen beschreibt die besten Vorgehensweisen für die Einrichtung.
Wenn Sie es nicht bereits getan haben, vergessen Sie nicht, Apache mit -g
neu zu erstellen, damit Sie Debug-Stubs haben, oder Sie werden mit verstümmelten Symbolnamen enden.
Das ist alt, kam aber erst bei einer Suche auf, also:
Nein, Sie können dies nicht innerhalb des CrashReporters tun. Sie können jedoch vermeiden, dass der CrashReporter aufgerufen wird, indem Sie Ihren eigenen Signalhandler installieren. KDE tut dies zum Beispiel, um einen eigenen Crash-Handler zu installieren. Mein Verständnis ist, dass im Fall einer Ausnahme, die zu einem Absturz führen würde, der Handler eine Anwendung aufruft, die den Absturz (DrKonqi) mit den relevanten Informationen behandelt, und sich dann selbst suspendiert (sendet sich selbst ein SIGSTOP nach dem Empfang, sagen wir, ein SIGSEGV ). DrKonqi wird dem Benutzer dann verschiedene Optionen zur Verfügung stellen, einschließlich eines Backtrace, der über gdb oder lldb unter OS X erfolgt.
Nichts hindert Sie daran, einen ähnlichen Ansatz zum Starten eines eigenständigen (GUI-) Debuggers zu verwenden und ihn an den fehlgeschlagenen Prozess anzuhängen. Dies wäre fast das Gleiche wie das Anhängen an den Prozess vor der Ausnahme, außer natürlich für irgendwelche Register, Stapel usw., die durch die Ausnahme verursacht wurden.