public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/remote: send qSymbol to all inferiors on startup
@ 2022-05-04 12:25 Simon Marchi
  0 siblings, 0 replies; only message in thread
From: Simon Marchi @ 2022-05-04 12:25 UTC (permalink / raw)
  To: gdb-cvs

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

commit 901e4e8d5c4f1d32c50e4a31b228bc7ef4210775
Author: Simon Marchi <simon.marchi@efficios.com>
Date:   Fri Apr 29 23:21:15 2022 -0400

    gdb/remote: send qSymbol to all inferiors on startup
    
    start_remote_1 calls remote_check_symbols after things are set up to
    give the remote side a chance to look up symbols.  One call to
    remote_check_symbols sets the "general thread", if needed, and sends one
    qSymbol packet.  However, a remote target could have more than one
    process on initial connection, and this would send a qSymbol for only
    one of these processes.
    
    Change it to iterate on all the target's inferiors and send a qSymbol
    packet for each one.
    
    I tested this by changing gdbserver to spawn two processes on startup:
    
        diff --git a/gdbserver/server.cc b/gdbserver/server.cc
        index 33c42714e72..9b682e9f85f 100644
        --- a/gdbserver/server.cc
        +++ b/gdbserver/server.cc
        @@ -3939,6 +3939,7 @@ captured_main (int argc, char *argv[])
    
               /* Wait till we are at first instruction in program.  */
               target_create_inferior (program_path.get (), program_args);
        +      target_create_inferior (program_path.get (), program_args);
    
               /* We are now (hopefully) stopped at the first instruction of
                 the target process.  This assumes that the target process was
    
    Instead of hacking GDBserver, it should also be possible to test this by
    starting manually two inferiors on an "extended-remote" connection,
    disconnecting from GDBserver (with the disconnect command), and
    re-connecting.
    
    I was able to see qSymbol being sent for each inferior:
    
          [remote] Sending packet: $Hgp828dc.828dc#1f
          [remote] Packet received: OK
          [remote] Sending packet: $qSymbol::#5b
          [remote] Packet received: qSymbol:6764625f6167656e745f6764625f74705f686561705f627566666572
          [remote] Sending packet: $qSymbol::6764625f6167656e745f6764625f74705f686561705f627566666572#1e
          [remote] Packet received: qSymbol:6e70746c5f76657273696f6e
          [remote] Sending packet: $qSymbol::6e70746c5f76657273696f6e#4d
          [remote] Packet received: OK
          [remote] Sending packet: $Hgp828dd.828dd#21
          [remote] Packet received: OK
          [remote] Sending packet: $qSymbol::#5b
          [remote] Packet received: qSymbol:6764625f6167656e745f6764625f74705f686561705f627566666572
          [remote] Sending packet: $qSymbol::6764625f6167656e745f6764625f74705f686561705f627566666572#1e
          [remote] Packet received: qSymbol:6e70746c5f76657273696f6e
          [remote] Sending packet: $qSymbol::6e70746c5f76657273696f6e#4d
          [remote] Packet received: OK
    
    Note that there would probably be more work to be done to fully support
    this scenario, more things that need to be done for each discovered
    inferior instead of just for one.
    
    Change-Id: I21c4ecf6367391e2e389b560f0b4bd906cf6472f

Diff:
---
 gdb/remote.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/gdb/remote.c b/gdb/remote.c
index fde6df3f84d..b8df3326849 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -5021,12 +5021,24 @@ remote_target::start_remote_1 (int from_tty, int extended_p)
 	target_async (1);
     }
 
-  /* If we connected to a live target, do some additional setup.  */
-  if (target_has_execution ())
+  /* Give the target a chance to look up symbols.  */
+  for (inferior *inf : all_inferiors (this))
     {
+      /* The inferiors that exist at this point were created from what
+	 was found already running on the remote side, so we know they
+	 have execution.  */
+      gdb_assert (this->has_execution (inf));
+
       /* No use without a symbol-file.  */
-      if (current_program_space->symfile_object_file)
-	remote_check_symbols ();
+      if (inf->pspace->symfile_object_file == nullptr)
+	continue;
+
+      /* Need to switch to a specific thread, because remote_check_symbols
+         uses INFERIOR_PTID to set the general thread.  */
+      scoped_restore_current_thread restore_thread;
+      thread_info *thread = any_thread_of_inferior (inf);
+      switch_to_thread (thread);
+      this->remote_check_symbols ();
     }
 
   /* Possibly the target has been engaged in a trace run started


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

only message in thread, other threads:[~2022-05-04 12:25 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-04 12:25 [binutils-gdb] gdb/remote: send qSymbol to all inferiors on startup 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).