Crash-Dump
-
Unter Windows kann man ja bei einem Crash noch einen Crash-Dump rausschreiben und wenn man sich beim Build Debugging-Infos hat generieren lassen, kann man die Anwendung auch halbwegs post-mortem-debuggen.
Jetzt würde ich das auch gerne unter Linux hinkriegen, bei Google finde ich aber nur irgendwas mit Kernel Crash Dumps. Gibt's da auch was für normale Applikationen?
-
P.S.:
Graham schrieb:
Unter Windows kann man ja bei einem Crash
Hiermit meine ich den Crash der von mir in C++ geschriebenen Software.
-
unter linux nennt man das coredump (siehe google).
-
Perfekt, ich danke dir! Für andere Interessierte: Hier ein guter Artikel.
-
Das funktioniert soweit, nur möchte ich jetzt im Signalhandler einen Dump anlegen. Das Anlegen des Dumps scheint aber Root-Rechte zu erfordern, auch wenn ich den Prozess als normaler User gestartet hab.
Gibt's da einen Weg drumherum? Ich will, dass der Prozess automatisiert von sich selbst einen Dump anlegen kann; z.B. indem er gcore aufruft. gcore bemängelt aber mangelnde Permission.
-
Das working directory ist auch im Home-Verzeichnis, deshalb kann es da nicht an mangelnden Schreibrechten für die Core-Datei liegen. Mit gdb kann ich mich auch nicht attach'en, ebenfalls wegen Rechten.
-
Ok, unter Ubuntu kann man scheinbar einem bestimmten Prozess erlauben, ptrace auf die eigene Software anzuwenden mit prctl(..PR_SET_PTRACER..).
Gibt's dafür eine ähnliche Lösung unter nicht-Ubuntus?
-
Da Ubuntu nichts besonderes ist, würde ich vermuten, dass das überall geht, ohne es jetzt zu testen.
-
Das wäre natürlich gut zu wissen! Ich will ja nicht jede Popeldistribution abdecken, aber zumindest das meistgenutzte.
Wer nicht Ubuntu nutzt: Bitte mal schauen, ob Folgendes kompiliert:
#include <sys/prctl.h> int main() { prctl( PR_SET_PTRACER, -1, 0, 0 ); }
-
Kannst du nicht einfach an der Stelle an der dus haben willst abort aufrufen? Wenn das Signal nicht abgefangen wird, gibt es standardmäßig einen coredump. Solltest du SIGABRT für was anderes brauchen gibts noch:
SIGQUIT
SIGILL
SIGFPE
Wenn man aus dem POSIX 1990 Standard rausgeht gibts sogar noch mehr Möglichkeiten.
-
linux_c89 schrieb:
Kannst du nicht einfach an der Stelle an der dus haben willst abort aufrufen? Wenn das Signal nicht abgefangen wird, gibt es standardmäßig einen coredump.
Jain. Nur, wenn man
ulimit -c unlimited
setzt, wobei ich das gerne komplett auf Softwareebene durchführen würde.setrlimit
klappt bei mir nicht.
Falls es so klappt, wäre das schonmal ganz gut, allerdings wäre es optimal, wenn ich dann noch den Dump verschicken könnte o.Ä. Obwohl ich dafür ja noch einen extra Daemon aufsetzen könnte.
-
Ach Gott, ich Idiot. Natürlich, 0 ist ja der Rückgabewert für "OK". Gnarr!
setrlimit
klappt. Alright, funktioniert. Haha, der Wald vor lauter Bäumen Danke dir!