diff options
-rw-r--r-- | gdb/breakpoint.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/longjmp-until-in-main.c | 34 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/longjmp-until-in-main.exp | 44 |
3 files changed, 79 insertions, 1 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index a3be125..74f5336 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -10489,7 +10489,7 @@ until_break_command (const char *arg, int from_tty, int anywhere) caller_frame_id, bp_until); breakpoints.emplace_back (std::move (caller_breakpoint)); - set_longjmp_breakpoint (tp, caller_frame_id); + set_longjmp_breakpoint (tp, stack_frame_id); lj_deleter.emplace (thread); } diff --git a/gdb/testsuite/gdb.base/longjmp-until-in-main.c b/gdb/testsuite/gdb.base/longjmp-until-in-main.c new file mode 100644 index 0000000..d4d860f --- /dev/null +++ b/gdb/testsuite/gdb.base/longjmp-until-in-main.c @@ -0,0 +1,34 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2022 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 <setjmp.h> + +void +func (void) +{ + jmp_buf buf; + + if (setjmp (buf) == 0) + longjmp (buf, 1); +} + +int +main () +{ + func (); + return 0; /* until to here */ +} diff --git a/gdb/testsuite/gdb.base/longjmp-until-in-main.exp b/gdb/testsuite/gdb.base/longjmp-until-in-main.exp new file mode 100644 index 0000000..53bc3ed --- /dev/null +++ b/gdb/testsuite/gdb.base/longjmp-until-in-main.exp @@ -0,0 +1,44 @@ +# Copyright 2022 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/>. + +# Test "until LINE", started in the "main()" frame, where the until +# command runs into a longjmp that lands in a frame that is inner than +# main. GDB internally intercepts the longjmp, sets a breakpoint at +# the jump destination, and once there, decides whether to stop or +# ignore the breakpoint hit depending on whether the initiating frame +# is present on the frame chain. GDB used to have a bug where it +# recorded the frame of the caller of main instead of the frame of +# main as the initiating frame, and then later on when deciding +# whether the longjmp landed somewhere inner than main, since +# unwinding normally stops at main, GDB would fail to find the +# initiating frame. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { + return +} + +if {![runto_main]} { + return +} + +delete_breakpoints + +set until_to_line [gdb_get_line_number "until to here"] + +gdb_test "until $until_to_line" \ + " until to here .*" \ + "until \$line, in main" |