X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=run-test-gdb.sh;h=fd75fa8f73726d6f7e06e5cfc5a536f7506c4ae6;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=a540281c7312f6e5ace61623a16169f0268899a7;hpb=cf4ebe486e7e0543ac8568d3043f43d95f197a96;p=senf.git diff --git a/run-test-gdb.sh b/run-test-gdb.sh index a540281..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,18 +35,19 @@ 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 (/^$/) { + if (/^$/) { $mode=1; } else { print; } } elsif ($mode==1) { - if (/^Breakpoint 1, exception/) { + if (/^(Breakpoint 1, exception|Program received signal )/) { $mode=2; @l=(); } else { @@ -61,15 +59,27 @@ gdb -batch -x .run-test-gdb.cmd ./.test.bin 2>/dev/null | perl -e ' elsif ($mode==2) { if (/^(#?[0-9]| )/) { push @l,$_ if /^#/; - $l[$#l] .= $_ if /^ /; + $l[$#l] .= $_ if @l && /^ /; + } 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; }