Better SENF configuration support (local_config.hh)
[senf.git] / run-test-gdb.sh
index 8d87f2a..7fa122a 100755 (executable)
@@ -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 (<STDIN>) {
     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;
+             if ($silent) {
+              unless (/at \/usr\/lib\/gcc\//) {
+                print;
+                $silent=0;
+              }
+             } else {
+               print unless /in \?\?/;
+               $silent=1 if /__gnu_debug::/;
+             }
           }
           print;
+          print "\n";
         } else {
           redo;
         }