[PATCH v2 2/2] gdb/remote: send qSymbol to all inferiors on startup
Simon Marchi
simon.marchi@polymtl.ca
Wed May 4 12:25:32 GMT 2022
On 2022-05-04 08:03, Pedro Alves wrote:
> On 2022-04-30 04:21, Simon Marchi via Gdb-patches wrote:
>> From: Simon Marchi <simon.marchi@efficios.com>
>>
>> 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. In theory, a remote target could have more than one
>> process on initial connection, and this would send a qSymbol for only
>> one of these processes.
>
> Not theory, it can really happen.
Removed the "in theory".
>
>>
>> Change it to iterate on all the target's inferiors and send a qSymbol
>> packet for each one.
>>
>> I was able to kind of test 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
>
> You don't need to hack gdbserver. You can instead connect in extended-remote mode,
> and run/start two inferiors. Then, issue "disconnect". gdbserver will stay
> open, debugging the two processes, waiting for another connection. Now connect
> gdb again to gdbserver, and it will discover the two processes.
Nice, that means we could eventually write a test (once it works
properly).
I added a note to say it would also be possible to test it this way.
>> And 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
>> ---
>> gdb/remote.c | 20 ++++++++++++++++----
>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/gdb/remote.c b/gdb/remote.c
>> index fde6df3f84d5..b82140dc3d09 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. */
>
> Something off with indentation -- tabs vs spaces?
Fixed.
> Otherwise LGTM.
Thanks, pushed with those fixes.
Simon
More information about the Gdb-patches
mailing list