Stacktrace im Programm

03/03/2011 - 09:47 von Ole Streicher | Report spam
Hallo,

ich möchte gerne ein Programm(-child) per Debugger (gdb) so überwachen,
dass ich im Absturzfall einen Stacktrace bekomme und diesen eventuell
sogar auf Serverseite auswerten kann.

Also etwa so:

pid_t pid = fork();
if (pid == 0) {
pid = getpid();
Gdb debugger = attach_gdb(pid);
on_program_crash_examine_stacktrace(debugger, pid);

do_whatever_i_want_in_the_child();
exit(0);
}

Meine Fragen wàren nun:
- Kann sich der Kindprozess selbst in den Debugger einweisen? Oder muss
das Papi machen? Falls letzteres, wie stelle ich sicher, dass der
Kindprozess nicht schon làngst fertig/abgestürzt ist, bevor der Parent
überhaupt den Debugger attachen konnte?
- Muss der Debugger einen eigenen Prozess bekommen?
- Wie bekomme ich den gdb dazu, mit mir programmatisch zu kommunizieren?
d.h., wie kann ich ihm einen per Programm auswertbaren Stacktrace
entlocken?

Hat jemand schonmal sowas gemacht und könnte hier einige Tips geben?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Ole Streicher
04/03/2011 - 11:52 | Warnen spam
Ich mach' dann mal die Ingrid:

Ole Streicher writes:
ich möchte gerne ein Programm(-child) per Debugger (gdb) so überwachen,
dass ich im Absturzfall einen Stacktrace bekomme und diesen eventuell
sogar auf Serverseite auswerten kann.



Folgendes funktioniert:

static int segv_handler(int sig) {
FILE *fp = fopen("gdb_commands", "w");
const char *gdb_commands = "set height 0set width 0bt fullinfo sources";
fprintf(fp, "%s", gdb_commands);
fclose(fp);

fp = fopen("backtrace.log", "w");
fprintf(fp, "Received signal: %i", sig);
fclose(fp);

char cmd[100];
snprintf(cmd, sizeof(cmd),
"gdb -batch -x gdb_commands --pid %i >> backtrace.log 2> /dev/null",
(int)getpid());
system(cmd);
unlink("gdb_commands");
exit(0);
}

mit den passenden signal(SIGSEGV, (sighandler_t) segv_handler); und
einem Parsen des erzeugten Logfiles auf Serverseite.

Jetzt stehe ich vor dem Problem, dass (unter Linux) hàufig gar kein
Signal erzeugt wird, sondern die Programme mit einem etwas mystischen

*** glibc detected *** python: double free or corruption (fasttop): 0x0000000000c52190 ***

nebst langem Output auf das Terminal crashen. Kann man dieses Verhalten
àndern, also im Fehlerfall anstelle der Ausgabe eine nutzerdefinierte
Funktion (z.B. den Signalhandler) aufrufen?

Viele Grüße

Ole

Ähnliche fragen