public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: add prepare_reinflate/reinflate around print_frame_args in info_frame_command_core
@ 2022-11-10 16:33 Simon Marchi
  0 siblings, 0 replies; only message in thread
From: Simon Marchi @ 2022-11-10 16:33 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=3dc9dde26d1c279e888d1fd0361f720e5a3721f3

commit 3dc9dde26d1c279e888d1fd0361f720e5a3721f3
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Mon Nov 7 09:55:23 2022 -0500

    gdb: add prepare_reinflate/reinflate around print_frame_args in info_frame_command_core
    
    I noticed this crash:
    
        $ ./gdb --data-directory=data-directory -nx -q \
              testsuite/outputs/gdb.python/pretty-print-call-by-hand/pretty-print-call-by-hand \
              -x testsuite/outputs/gdb.python/pretty-print-call-by-hand/pretty-print-call-by-hand.py \
              -ex "b g" -ex r
        (gdb) info frame
        Stack level 0, frame at 0x7fffffffdd80:
         rip = 0x555555555160 in g
            (/home/simark/src/binutils-gdb/gdb/testsuite/gdb.python/pretty-print-call-by-hand.c:41); saved rip = 0x5555555551a3
         called by frame at 0x7fffffffdda0
         source language c.
         Arglist at 0x7fffffffdd70, args: mt=mytype is 0x555555556004 "hello world",
            depth=10
    
        Fatal signal: Segmentation fault
    
    This is another case of frame_info being invalidated under a function's
    feet.  The stack trace when the frame_info get invalidated looks like:
    
        ... many frames to pretty print the arg, that eventually invalidate the frame_infos ...
        #35 0x00005568d0a8ab24 in print_frame_arg (fp_opts=..., arg=0x7ffc3216bcb0) at /home/simark/src/binutils-gdb/gdb/stack.c:489
        #36 0x00005568d0a8cc75 in print_frame_args (fp_opts=..., func=0x621000233210, frame=..., num=-1, stream=0x60b000000300)
            at /home/simark/src/binutils-gdb/gdb/stack.c:898
        #37 0x00005568d0a9536d in info_frame_command_core (fi=..., selected_frame_p=true) at /home/simark/src/binutils-gdb/gdb/stack.c:1682
    
    print_frame_args knows that print_frame_arg can invalidate frame_info
    objects, and therefore calls prepare_reinflate/reinflate.  However,
    info_frame_command_core has a separate frame_info_ptr instance (it is
    passed by value / copy).  So info_frame_command_core needs to know that
    print_frame_args can invalidate frame_info objects, and therefore needs
    to prepare_reinflate/reinflate as well.  Add those calls, and enhance
    the gdb.python/pretty-print-call-by-hand.exp test to test that command.
    
    Reviewed-By: Bruno Larsen <blarsen@redhat.com>
    Change-Id: I9edaae06d62e97ffdb30938d364437737238a960

Diff:
---
 gdb/stack.c                                            | 4 ++++
 gdb/testsuite/gdb.python/pretty-print-call-by-hand.exp | 8 ++++++++
 2 files changed, 12 insertions(+)

diff --git a/gdb/stack.c b/gdb/stack.c
index 653251c200b..4e2342c2a8d 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1679,8 +1679,12 @@ info_frame_command_core (frame_info_ptr fi, bool selected_frame_p)
 	    else
 	      gdb_printf (" %d args: ", numargs);
 	  }
+
+	fi.prepare_reinflate ();
 	print_frame_args (user_frame_print_options,
 			  func, fi, numargs, gdb_stdout);
+	fi.reinflate ();
+
 	gdb_puts ("\n");
       }
   }
diff --git a/gdb/testsuite/gdb.python/pretty-print-call-by-hand.exp b/gdb/testsuite/gdb.python/pretty-print-call-by-hand.exp
index 0aeb2218f91..eb3fc9e35fa 100644
--- a/gdb/testsuite/gdb.python/pretty-print-call-by-hand.exp
+++ b/gdb/testsuite/gdb.python/pretty-print-call-by-hand.exp
@@ -98,6 +98,14 @@ with_test_prefix "frame print" {
 	"backtrace test"
     }
 }
+
+# Test the "info frame" command
+with_test_prefix "info frame" {
+    if { [start_test "TAG: first frame"] == 0 } {
+	gdb_test "info frame" "mytype is $hex \"hello world\".*"
+    }
+}
+
 # Testing the down command.
 with_test_prefix "frame movement down" {
     if { [start_test "TAG: first frame"] == 0 } {

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-11-10 16:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-10 16:33 [binutils-gdb] gdb: add prepare_reinflate/reinflate around print_frame_args in info_frame_command_core Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).