From: Tom H. <th...@cy...> - 2004-09-26 18:44:16
|
CVS commit by thughes: When dieing because a fatal signal was received, print a stack trace for the location where the signal was received rather then the signal handler. M +2 -0 core.h 1.31 M +14 -7 vg_mylibc.c 1.91 M +5 -1 vg_signals.c 1.89 --- valgrind/coregrind/core.h #1.30:1.31 @@ -1019,4 +1019,6 @@ extern void VG_(core_assert_fail) ( cons __attribute__ ((__noreturn__)) extern void VG_(core_panic) ( Char* str ); +__attribute__ ((__noreturn__)) +extern void VG_(core_panic_at) ( Char* str, ExeContext *ec ); /* Tools use VG_(strdup)() which doesn't expose ArenaId */ --- valgrind/coregrind/vg_mylibc.c #1.90:1.91 @@ -1105,7 +1105,9 @@ static inline ExeContext *get_real_execo __attribute__ ((noreturn)) -static void report_and_quit ( const Char* report ) +static void report_and_quit ( const Char* report, ExeContext *ec ) { - ExeContext *ec = get_real_execontext((Addr)__builtin_return_address(0)); + if (ec == NULL) + ec = get_real_execontext((Addr)__builtin_return_address(0)); + VG_(pp_ExeContext)(ec); @@ -1132,5 +1134,5 @@ static void assert_fail ( const Char* ex VG_(printf)("\n%s: %s:%d (%s): Assertion `%s' failed.\n", name, file, line, fn, expr ); - report_and_quit(report); + report_and_quit(report, NULL); } @@ -1147,19 +1149,24 @@ void VG_(core_assert_fail) ( const Char* __attribute__ ((noreturn)) -static void panic ( Char* name, Char* report, Char* str ) +static void panic ( Char* name, Char* report, Char* str, Addr addr ) { VG_(printf)("\n%s: the `impossible' happened:\n %s\n", name, str); VG_(printf)("Basic block ctr is approximately %llu\n", VG_(bbs_done) ); - report_and_quit(report); + report_and_quit(report, addr); } void VG_(core_panic) ( Char* str ) { - panic("valgrind", VG_BUGS_TO, str); + panic("valgrind", VG_BUGS_TO, str, NULL); +} + +void VG_(core_panic_at) ( Char* str, ExeContext *ec ) +{ + panic("valgrind", VG_BUGS_TO, str, ec); } void VG_(skin_panic) ( Char* str ) { - panic(VG_(details).name, VG_(details).bug_reports_to, str); + panic(VG_(details).name, VG_(details).bug_reports_to, str, NULL); } --- valgrind/coregrind/vg_signals.c #1.88:1.89 @@ -1852,5 +1852,9 @@ void vg_sync_signalhandler ( Int sigNo, if (0) VG_(kill_self)(sigNo); /* generate a core dump */ - VG_(core_panic)("Killed by fatal signal"); + VG_(core_panic_at)("Killed by fatal signal", + VG_(get_ExeContext2)(uc->uc_mcontext.eip, + uc->uc_mcontext.ebp, + uc->uc_mcontext.esp, + VG_(valgrind_last))); } } |