diff options
author | Tom Tromey <tromey@redhat.com> | 2010-12-09 16:09:54 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-12-09 16:09:54 +0000 |
commit | 186c406b1903ea0f146f05ba5570fbf46bff3eab (patch) | |
tree | 28cee06273921298a80ba388e91cb3fa67e9ef5a /gdb/testsuite | |
parent | 8b9a522f5779a9e8640df98c7010f763b008f625 (diff) | |
download | gdb-186c406b1903ea0f146f05ba5570fbf46bff3eab.zip gdb-186c406b1903ea0f146f05ba5570fbf46bff3eab.tar.gz gdb-186c406b1903ea0f146f05ba5570fbf46bff3eab.tar.bz2 |
gdb
PR c++/9593:
* thread.c (clear_thread_inferior_resources): Call
delete_longjmp_breakpoint.
* infrun.c (handle_inferior_event): Handle exception breakpoints.
(handle_inferior_event): Likewise.
(insert_exception_resume_breakpoint): New function.
(check_exception_resume): Likewise.
* inferior.h (delete_longjmp_breakpoint_cleanup): Declare.
* infcmd.c (delete_longjmp_breakpoint_cleanup): No longer static.
(step_1): Set thread's initiating frame.
(until_next_continuation): New function.
(until_next_command): Support exception breakpoints.
(finish_command_continuation): Delete longjmp breakpoint.
(finish_forward): Support exception breakpoints.
* gdbthread.h (struct thread_info) <initiating_frame>: New field.
* breakpoint.h (enum bptype) <bp_exception, bp_exception_resume,
bp_exception_master>: New constants.
(struct bpstat_what) <is_longjmp>: New field.
(set_longjmp_breakpoint): Update.
* breakpoint.c (create_exception_master_breakpoint): New function.
(update_breakpoints_after_exec): Handle bp_exception_master. Call
create_exception_master_breakpoint.
(print_it_typical): Handle bp_exception_master, bp_exception.
(bpstat_stop_status): Handle bp_exception_master.
(bpstat_what): Handle bp_exception_master, bp_exception,
bp_exception_resume.
(bptype_string): Likewise.
(print_one_breakpoint_location): Likewise.
(allocate_bp_location): Likewise.
(set_longjmp_breakpoint): Handle exception breakpoints. Change
interface.
(delete_longjmp_breakpoint): Handle exception breakpoints.
(mention): Likewise.
(struct until_break_command_continuation_args) <thread_num>: New
field.
(until_break_command_continuation): Call
delete_longjmp_breakpoint.
(until_break_command): Support exception breakpoints.
(delete_command): Likewise.
(breakpoint_re_set_one): Likewise.
(breakpoint_re_set): Likewise.
gdb/testuite
* gdb.java/jnpe.java: New file.
* gdb.java/jnpe.exp: New file.
* gdb.cp/nextoverthrow.exp: New file.
* gdb.cp/nextoverthrow.cc: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/nextoverthrow.cc | 203 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/nextoverthrow.exp | 153 | ||||
-rw-r--r-- | gdb/testsuite/gdb.java/jnpe.exp | 74 | ||||
-rw-r--r-- | gdb/testsuite/gdb.java/jnpe.java | 40 |
5 files changed, 477 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 523374e..6ed7ab3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-09 Tom Tromey <tromey@redhat.com> + + * gdb.java/jnpe.java: New file. + * gdb.java/jnpe.exp: New file. + * gdb.cp/nextoverthrow.exp: New file. + * gdb.cp/nextoverthrow.cc: New file. + 2010-12-07 Doug Evans <dje@google.com> * gdb.base/catch-syscall.exp (do_syscall_tests): Remove setting diff --git a/gdb/testsuite/gdb.cp/nextoverthrow.cc b/gdb/testsuite/gdb.cp/nextoverthrow.cc new file mode 100644 index 0000000..b25cb34 --- /dev/null +++ b/gdb/testsuite/gdb.cp/nextoverthrow.cc @@ -0,0 +1,203 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include <iostream> + +using namespace std; + +void dummy () +{ +} + +class NextOverThrowDerivates +{ + +public: + + + // Single throw an exception in this function. + void function1 (int val) + { + throw val; + } + + // Throw an exception in another function. + void function2 (int val) + { + function1 (val); + } + + // Throw an exception in another function, but handle it + // locally. + void function3 (int val) + { + { + try + { + function1 (val); + } + catch (...) + { + cout << "Caught and handled function1 exception" << endl; + } + } + } + + void rethrow (int val) + { + try + { + function1 (val); + } + catch (...) + { + throw; + } + } + + void finish (int val) + { + // We use this to test that a "finish" here does not end up in + // this frame, but in the one above. + try + { + function1 (val); + } + catch (int x) + { + } + function1 (val); // marker for until + } + + void until (int val) + { + function1 (val); + function1 (val); // until here + } + +}; +NextOverThrowDerivates next_cases; + + +int main () +{ + int testval = -1; + + try + { + next_cases.function1 (0); // Start: first test + } + catch (int val) + { + dummy (); + testval = val; // End: first test + } + + try + { + next_cases.function2 (1); // Start: nested throw + } + catch (int val) + { + dummy (); + testval = val; // End: nested throw + } + + try + { + // This is duplicated so we can next over one but step into + // another. + next_cases.function2 (2); // Start: step in test + } + catch (int val) + { + dummy (); + testval = val; // End: step in test + } + + next_cases.function3 (3); // Start: next past catch + dummy (); + testval = 3; // End: next past catch + + try + { + next_cases.rethrow (4); // Start: rethrow + } + catch (int val) + { + dummy (); + testval = val; // End: rethrow + } + + try + { + // Another duplicate so we can test "finish". + next_cases.function2 (5); // Start: first finish + } + catch (int val) + { + dummy (); + testval = val; // End: first finish + } + + // Another test for "finish". + try + { + next_cases.finish (6); // Start: second finish + } + catch (int val) + { + dummy (); + testval = val; // End: second finish + } + + // Test of "until". + try + { + next_cases.finish (7); // Start: first until + } + catch (int val) + { + dummy (); + testval = val; // End: first until + } + + // Test of "until" with an argument. + try + { + next_cases.until (8); // Start: second until + } + catch (int val) + { + dummy (); + testval = val; // End: second until + } + + // Test of "advance". + try + { + next_cases.until (9); // Start: advance + } + catch (int val) + { + dummy (); + testval = val; // End: advance + } + + testval = 32; // done +} + diff --git a/gdb/testsuite/gdb.cp/nextoverthrow.exp b/gdb/testsuite/gdb.cp/nextoverthrow.exp new file mode 100644 index 0000000..960ea0d --- /dev/null +++ b/gdb/testsuite/gdb.cp/nextoverthrow.exp @@ -0,0 +1,153 @@ +# Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "nextoverthrow" +set srcfile ${testfile}.cc +set binfile $objdir/$subdir/$testfile + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile} "c++"] { + untested nextoverthrow.exp + return -1 +} + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +if ![runto_main] then { + perror "couldn't run to main" + continue +} + +# See whether we have the needed unwinder hooks. +set ok 1 +gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook" { + -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" { + pass "check for unwinder hook" + } + -re "No symbol .* in current context.\r\n$gdb_prompt $" { + # Pass the test so we don't get bogus fails in the results. + pass "check for unwinder hook" + set ok 0 + } +} +if {!$ok} { + unsupported "nextoverthrow.exp could not find _Unwind_DebugHook" + return -1 +} + +# Set a temporary breakpoint and then continue to it. +# The breakpoint is set according to a marker in the file. +proc tbreak_and_cont {text} { + global testfile + + set line [gdb_get_line_number $text $testfile.cc] + gdb_breakpoint "$testfile.cc:$line" temporary + gdb_test "continue" "Temporary breakpoint.*" "continuing to $text" +} + +# Verify the value of testval. +proc verify_testval {name value} { + gdb_test "print testval == $value" " = true" $name +} + +# See http://sourceware.org/bugzilla/show_bug.cgi?id=9593 +# Our general approach here is to do some operation, verify +# that testval has not changed, continue to the location at +# which the next test starts, and verify testval again. +# This works around platform differences in debuginfo that +# make looking at the source line unreliable. + +# A simple test of next over a throw. +tbreak_and_cont "Start: first test" +gdb_test "next" ".*" "next over a throw 1" +tbreak_and_cont "End: first test" +verify_testval "pre-check - next over a throw 1" -1 + +tbreak_and_cont "Start: nested throw" +verify_testval "post-check - next over a throw 1" 0 +gdb_test "next" ".*" "next over a throw 2" +tbreak_and_cont "End: nested throw" +verify_testval "pre-check - next over a throw 2" 0 + +tbreak_and_cont "Start: step in test" +verify_testval "post-check - next over a throw 2" 1 +gdb_test "step" "function1().*" "step into function2 1" +gdb_test "next" ".*" "next over a throw 3" +tbreak_and_cont "End: step in test" +verify_testval "pre-check - next over a throw 3" 1 + +tbreak_and_cont "Start: next past catch" +verify_testval "post-check - next over a throw 3" 2 +gdb_test "next" ".*" "next past catch" +tbreak_and_cont "End: next past catch" +verify_testval "pre-check - next past catch" 2 + +tbreak_and_cont "Start: rethrow" +verify_testval "post-check - next past catch" 3 +gdb_test "next" ".*" "next over a throw 4" +tbreak_and_cont "End: rethrow" +verify_testval "pre-check - next over a throw 4" 3 + +tbreak_and_cont "Start: first finish" +verify_testval "post-check - next over a throw 4" 4 +gdb_test "step" "function1().*" "step into function2 2" +gdb_test "finish" ".*" "finish 1" +tbreak_and_cont "End: first finish" +verify_testval "pre-check - finish 1" 4 + +tbreak_and_cont "Start: second finish" +verify_testval "post-check - finish 1" 5 +gdb_test "step" "function1 ().*" "step into finish method" +gdb_test "finish" ".*" "finish 2" +tbreak_and_cont "End: second finish" +verify_testval "pre-check - finish 2" 5 + +tbreak_and_cont "Start: first until" +verify_testval "post-check - finish 2" 6 +gdb_test "step" ".*" "step into finish, for until" +gdb_test "until" ".*" "until with no argument 1" +set line [gdb_get_line_number "marker for until" $testfile.cc] +gdb_test "until $line" "function1 ().*" "next past catch 6" +gdb_test "until" ".*" "until with no argument 2" +tbreak_and_cont "End: first until" +verify_testval "pre-check - until 1" 6 + +tbreak_and_cont "Start: second until" +verify_testval "post-check - until 1" 7 +set line [gdb_get_line_number "until here" $testfile.cc] +gdb_test "step" "function1 ().*" "step into until" +gdb_test "until $line" ".*" "until-over-throw" +tbreak_and_cont "End: second until" +verify_testval "pre-check - until 2" 7 + +tbreak_and_cont "Start: advance" +verify_testval "post-check - until 2" 8 +gdb_test "step" "function1 ().*" "step into until, for advance" +gdb_test "advance $line" ".*" "advance-over-throw" +tbreak_and_cont "End: advance" +verify_testval "pre-check - advance" 8 + +tbreak_and_cont "done" +verify_testval "post-check - advance" 9 diff --git a/gdb/testsuite/gdb.java/jnpe.exp b/gdb/testsuite/gdb.java/jnpe.exp new file mode 100644 index 0000000..f2895f6 --- /dev/null +++ b/gdb/testsuite/gdb.java/jnpe.exp @@ -0,0 +1,74 @@ +# Copyright 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if $tracelevel then { + strace $tracelevel +} + +load_lib "java.exp" + +set testfile "jnpe" +set srcfile ${testfile}.java +set binfile ${objdir}/${subdir}/${testfile} +if { [compile_java_from_source ${srcdir}/$subdir/${srcfile} ${binfile} "-g"] != "" } { + untested "Couldn't compile ${srcdir}/$subdir/${srcfile}" + return -1 +} + +# Start with a fresh gdb. + +clean_restart $testfile + +set line [gdb_get_line_number "break here" $testfile.java] +if ![runto "$testfile.java:$line"] then { + perror "couldn't run to jnpe.main" + continue +} + +# See whether we have the needed unwinder hooks. +set ok 1 +gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook in java" { + -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" { + pass "check for unwinder hook in java" + } + -re "No symbol .* in current context.?\r\n$gdb_prompt $" { + # Pass the test so we don't get bogus fails in the results. + setup_xfail *-*-* + fail "check for unwinder hook in java" + set ok 0 + } +} +if {!$ok} { + unsupported "jnpe.exp could not find _Unwind_DebugHook" + return -1 +} + +gdb_test "handle SIGSEGV nostop noprint" \ + "SIGSEGV.*fault" \ + "disable SIGSEGV for next-over-NPE" + +# The line where we stop differs according to gcj; just check that we +# did not already execute the catch point. This is done in a somewhat +# funny way due to other gcj debuginfo oddities that don't +# meaningfully affect the user's experience. + +gdb_test "next" \ + ".*" \ + "next over NPE" + +set line [gdb_get_line_number "stop point"] +gdb_breakpoint $line +gdb_test "continue" "Continuing.\[\r\n\]*success\[\r\n\]*Breakpoint .*:$line\[\r\n\]*.*// stop point\[\r\n\]*" \ + "continue to success for next-over-NPE" diff --git a/gdb/testsuite/gdb.java/jnpe.java b/gdb/testsuite/gdb.java/jnpe.java new file mode 100644 index 0000000..be096ce --- /dev/null +++ b/gdb/testsuite/gdb.java/jnpe.java @@ -0,0 +1,40 @@ +// Test next-over-NPE. +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009, 2010 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +public class jnpe +{ + public static String npe () + { + return ((Object) null).toString(); + } + + public static void main (String[] args) + { + try + { + System.out.println (npe ()); // break here + } + catch (NullPointerException n) + { + System.out.println ("success"); + } + + System.out.println ("blah"); // stop point + } +} |