From: Pedro Alves Date: Thu, 27 Aug 2020 20:03:53 +0000 (+0100) Subject: Fix advance/until and inline frames (PR gdb/26523) X-Git-Tag: gdb-10.1-release~255 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b2b38aa45ba2eb2e7e4c70689d679c4c467eda73;p=thirdparty%2Fbinutils-gdb.git Fix advance/until and inline frames (PR gdb/26523) If you do "tbreak LINENO; c" to advance to an inlined function, GDB presents the stop at the inline frame instead of at the non-artificial stack frame: (gdb) list 21 18 static inline __attribute__ ((always_inline)) int 19 inline_func (int i) 20 { 21 return i + 1; 22 } (gdb) tbreak 21 Temporary breakpoint 3 at 0x55555555516f: advance.cc:21. (gdb) c Continuing. Temporary breakpoint 3, inline_func (i=0) at advance.cc:21 21 return i + 1; The logic for this is in stopped_by_user_bp_inline_frame: /* Loop over the stop chain and determine if execution stopped in an inlined frame because of a breakpoint with a user-specified location set at FRAME_BLOCK. */ static bool stopped_by_user_bp_inline_frame (const block *frame_block, bpstat stop_chain) If however, you do "advance LINENO" or "until LINENO" instead, GDB presents the stop at the non-artificial frame: (gdb) advance 21 main () at advance.cc:43 43 i = inline_func (i); (gdb) "advance" and "until" should really behave like user breakpoints here, since their location is also user-specified. As the comment in gdb.base/advance.exp says, "advance " is really just syntactic sugar for "tbreak ; continue". Fix this by making stopped_by_user_bp_inline_frame also consider advance/until breakpoints. A testcase covering this will be included in the next patch. gdb/ChangeLog: PR gdb/26523 * inline-frame.c (stopped_by_user_bp_inline_frame): Also consider bp_until breakpoints user-specified locations. Update intro comment. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 966d39301fb..d9cb0b17643 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-08-27 Pedro Alves + + PR gdb/26523 + * inline-frame.c (stopped_by_user_bp_inline_frame): Also consider + bp_until breakpoints user-specified locations. Update intro + comment. + 2020-08-27 Simon Marchi * gdb_bfd.h (gdb_bfd_section_iterator, gdb_bfd_section_range, diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c index c650195e570..35ceb27d9c1 100644 --- a/gdb/inline-frame.c +++ b/gdb/inline-frame.c @@ -303,7 +303,8 @@ block_starting_point_at (CORE_ADDR pc, const struct block *block) } /* Loop over the stop chain and determine if execution stopped in an - inlined frame because of a user breakpoint set at FRAME_BLOCK. */ + inlined frame because of a breakpoint with a user-specified location + set at FRAME_BLOCK. */ static bool stopped_by_user_bp_inline_frame (const block *frame_block, bpstat stop_chain) @@ -312,7 +313,8 @@ stopped_by_user_bp_inline_frame (const block *frame_block, bpstat stop_chain) { struct breakpoint *bpt = s->breakpoint_at; - if (bpt != NULL && user_breakpoint_p (bpt)) + if (bpt != NULL + && (user_breakpoint_p (bpt) || bpt->type == bp_until)) { bp_location *loc = s->bp_location_at; enum bp_loc_type t = loc->loc_type;