# 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
# 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 (/^$/) {
}
}
elsif ($mode==1) {
- if (/^Breakpoint 1, exception/) {
+ if (/^(Breakpoint 1, exception|Program received signal )/) {
$mode=2;
@l=();
} else {
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;
}