Hi Qt-Forum,
ich suche nach einer Möglichkeit, wie ich den Anwender z.B. einen gdb dump nach Programmabsturz senden lassen kann. Gibt es schon etwas, das ich unter linux benutzen darf? Es muss auch bei kommerzieller Nutzung erlaubt sein.
Debug Informationen dumpen?
Re: Debug Informationen dumpen?
Gegenfrage: Lieferst Du denn das Programm in einer Version aus, die mit Debug Informationen gebaut ist? Und wenn ja (was ich eher bezweifeln möchte) lässt Du denn das Programm beim Anwender immer mit angehängtem Debugger laufen?
Re: Debug Informationen dumpen?
Naja sehr ungern, aber gefordert ist, dass wir bei solchen Fehlern debuggen können. Wenn gdb mit läuft ist es ja nicht gerade performant. Die Forderung ist eben, dass wir segfaults debuggen können.
Re: Debug Informationen dumpen?
Ich habe sowas mal unter Solaris gebastelt.. es geht schon ohne laufenden gdb, aber es ist keine sehr elegante Methode:
Bei Debug-Binaries kann man auf (den meisten) Unix-Systemen jederzeit den aktuellen Stack anzeigen lassen ("pstack", http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?pstack) oder einen Core-Dump (Zwecks späteren Laden in einem Debugger) erstellen ("gcore", http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?gcore).
Daher:
1. Im entsprechenden Programm müssen mehrere Signal-Handler aufgesetzt werden, so dass im Crash-Fall (SIGSEGV & CO) noch eine C-Funktion ausgeführt wird. Siehe dazu "man signal".
2. In dieser wird dann mit "getpid()" die eigene PID ermittelt, das Kommando "pstack pid > /tmp/crashdump.txt" zusammengestellt und mittels "system()" ausgeführt.
Das Problem hierbei ist, dass ein Crash-Signal jederzeit (z.B. auch beim Speicherallokieren) kommen kann und man daher im Signal-Handler nicht mehr zuviel machen kann... ich habe da schon rekursive Crashes beobachten können
Daher: so wenig Code wie möglich. Ich würde auch auf Qt-Klassen verzichten. Falls du den Dump noch weiterverarbeiten möchtest, würde ich das nicht im abgestützten Programm machen, sondern erst "post-mortem" (z.B: via Start-Shellscript).
hth..
Bei Debug-Binaries kann man auf (den meisten) Unix-Systemen jederzeit den aktuellen Stack anzeigen lassen ("pstack", http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?pstack) oder einen Core-Dump (Zwecks späteren Laden in einem Debugger) erstellen ("gcore", http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?gcore).
Daher:
1. Im entsprechenden Programm müssen mehrere Signal-Handler aufgesetzt werden, so dass im Crash-Fall (SIGSEGV & CO) noch eine C-Funktion ausgeführt wird. Siehe dazu "man signal".
2. In dieser wird dann mit "getpid()" die eigene PID ermittelt, das Kommando "pstack pid > /tmp/crashdump.txt" zusammengestellt und mittels "system()" ausgeführt.
Das Problem hierbei ist, dass ein Crash-Signal jederzeit (z.B. auch beim Speicherallokieren) kommen kann und man daher im Signal-Handler nicht mehr zuviel machen kann... ich habe da schon rekursive Crashes beobachten können
Daher: so wenig Code wie möglich. Ich würde auch auf Qt-Klassen verzichten. Falls du den Dump noch weiterverarbeiten möchtest, würde ich das nicht im abgestützten Programm machen, sondern erst "post-mortem" (z.B: via Start-Shellscript).
hth..