diff options
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/gdb.python/py-finish-breakpoint2.cc | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-finish-breakpoint2.exp | 47 |
2 files changed, 47 insertions, 5 deletions
diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint2.cc b/gdb/testsuite/gdb.python/py-finish-breakpoint2.cc index 8423423..7e53d53 100644 --- a/gdb/testsuite/gdb.python/py-finish-breakpoint2.cc +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint2.cc @@ -17,9 +17,13 @@ #include <iostream> +int i; + void throw_exception_1 (int e) { + i += 1; /* Finish breakpoint is set here. */ + i += 1; /* Break before exception. */ throw new int (e); } @@ -32,7 +36,6 @@ throw_exception (int e) int main (void) { - int i; try { throw_exception_1 (10); diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp index 3075847..bd1e96b 100644 --- a/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp @@ -38,21 +38,60 @@ set pyfile [gdb_remote_download host \ # Check FinishBreakpoints against C++ exceptions # +gdb_breakpoint [gdb_get_line_number "Break before exception"] gdb_breakpoint [gdb_get_line_number "Break after exception 2"] gdb_test "source $pyfile" ".*Python script imported.*" \ "import python scripts" gdb_breakpoint "throw_exception_1" + +# +# Part 1. +# + gdb_test "continue" "Breakpoint .*throw_exception_1.*" "run to exception 1" -gdb_test "python print (len(gdb.breakpoints()))" "3" "check BP count" +# Count breakpoints before setting finishbreakpoint. +gdb_test "python print (len(gdb.breakpoints()))" "4" "check BP count" + gdb_test "python ExceptionFinishBreakpoint(gdb.newest_frame())" \ "init ExceptionFinishBreakpoint" "set FinishBP after the exception" -gdb_test "continue" ".*stopped at ExceptionFinishBreakpoint.*" "check FinishBreakpoint in catch()" -gdb_test "python print (len(gdb.breakpoints()))" "3" "check finish BP removal" -gdb_test "continue" ".*Breakpoint.* throw_exception_1.*" "continue to second exception" +gdb_test "continue" "Break before exception.*" \ + "break before exception" + +set need_continue 0 +gdb_test_multiple "continue" "finishBP out-of-scope" { + -re -wrap "exception did not finish.*" { + # Out-of-scope. For instance on x86_64 with unix/-m32. + pass $gdb_test_name + } + -re -wrap "stopped at ExceptionFinishBreakpoint.*" { + # Triggered despite the fact that the function call never finished. + # It just so happens to be that the frame return address at which the + # breakpoint is set, is also the first instruction after the exception + # has been handled. For instance on x86_64 with unix/-m64. + kfail python/29909 $gdb_test_name + set need_continue 1 + } +} + +# Count breakpoints, check that the finishbreakpoint has been removed. +gdb_test "python print (len(gdb.breakpoints()))" "4" "check finish BP removal" + +# +# Part 2. +# + +if { $need_continue } { + gdb_test "continue" ".*Breakpoint.* throw_exception_1.*" \ + "continue to second exception" +} gdb_test "python ExceptionFinishBreakpoint(gdb.newest_frame())" \ "init ExceptionFinishBreakpoint" "set FinishBP after the exception again" + +gdb_test "continue" "Break before exception.*" \ + "break before exception again" + gdb_test "continue" ".*exception did not finish.*" "FinishBreakpoint with exception thrown not caught" |