Skip to content

Commit

Permalink
gdb/remote: send qSymbol to all inferiors on startup
Browse files Browse the repository at this point in the history
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
  • Loading branch information
simark committed May 4, 2022
1 parent 06c7226 commit 901e4e8
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions gdb/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 901e4e8

Please sign in to comment.