X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=run-test-gdb.sh;h=fd75fa8f73726d6f7e06e5cfc5a536f7506c4ae6;hb=3863d46dd898b7bc35ea8c6ccd8563b18762a6b6;hp=8d87f2ad889b020b8690f7495378fc45a17a5094;hpb=821f1bf89a0e3ef83469c56e4a9a21c39b956cb4;p=senf.git diff --git a/run-test-gdb.sh b/run-test-gdb.sh index 8d87f2a..fd75fa8 100755 --- a/run-test-gdb.sh +++ b/run-test-gdb.sh @@ -8,9 +8,6 @@ # This script will run the .test.bin test driver within gdb and will # create a backtrace for every exception caught by the test driver. # -# NOTE: If your unit test (excplicitly) writes output to stderr, this -# output will be lost -# # NOTE: This works by setting a breakpoint in the std::exception # constructor. This is, where the backtrace is created from. If you do # some funky manipulations with your exceptions, the backtrace might @@ -38,8 +35,9 @@ EOF # correctly (cought before the reach the unit test driver). It will # also truncate the backtrace at the first stackframe within the unit # test subsystem since we are only interested in the user code. -gdb -batch -x .run-test-gdb.cmd ./.test.bin 2>/dev/null | perl -e ' +gdb -batch -x .run-test-gdb.cmd ./.test.bin 2>&1 | perl -e ' $mode=0; + $silent=0; while () { if ($mode==0) { if (/^$/) { @@ -49,7 +47,7 @@ gdb -batch -x .run-test-gdb.cmd ./.test.bin 2>/dev/null | perl -e ' } } elsif ($mode==1) { - if (/^Breakpoint 1, exception/) { + if (/^(Breakpoint 1, exception|Program received signal )/) { $mode=2; @l=(); } else { @@ -62,16 +60,26 @@ gdb -batch -x .run-test-gdb.cmd ./.test.bin 2>/dev/null | perl -e ' if (/^(#?[0-9]| )/) { push @l,$_ if /^#/; $l[$#l] .= $_ if @l && /^ /; - } elsif (/^Current language: auto;/) { + } elsif (/^(Current language: auto;|\[Switching to Thread)/) { ; } else { $mode=0; if (/: fatal error in /) { + print "\n"; for (@l[1..$#l]) { - last if /^#[0-9]+ +0x[0-9a-f]+ in boost::unit_test::ut_detail::invoker/; - print; + last if /^#[0-9]+ +0x[0-9a-f]+ in boost::unit_test::ut_detail::invoker/; + if ($silent) { + unless (/at \/usr\/lib\/gcc\//) { + print; + $silent=0; + } + } else { + print unless /in \?\?/; + $silent=1 if /__gnu_debug::/; + } } print; + print "\n"; } else { redo; }