Re: Async + all-stop mode for gdbserver

Pedro Alves <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Hi!

On 2024-05-26 01:57, Yibo Yan via Gdb wrote:
> Hi,
> 
> I am working on a project to support a unified view for debugging
> distributed systems, and I am using gdbserver to be attached to the remote
> processes.
> 
> I need to use gdbserver with `mi-async on` and `non-stop off`, which seems
> to work correctly with gdb, but this is not the case when the gdb is
> connected to the gdbserver.
> 
> One simple use case here is to list all thread information (-thread-info)
> when the target is running. The command gets executed correctly when the
> gdb is locally attached to a running process and returns the list of thread
> information. When the gdb is remotely connected to the gdbserver, the
> behavior is not consistent, as it doesn't allow me to run `-thread-info`
> anymore.
> 
> Looking at the design of RSP, I can tell it doesn't have a specific packet
> for enabling async mode besides `QNonStop` for enabling non-stop mode.
> Looks like the source code of gdbserver also indicates the same thing ---
> the async mode is only enabled when the non-stop mode is enabled.
> 
> My question is whether this is intended behavior or potentially a design
> flaw or bug? I am aware that I can still manually interrupt and resume all
> threads to mimic the behavior of async + all-stop. I am just wondering if I
> can achieve the same thing directly from gdbserver instead of hacking it
> this way.
> 
> Many thanks!

It's intended, but unfortunately, the transition was never completed.  If you do
"maint set target-non-stop on" before connecting, then the remote connection with use
QNonStop to enable non-stop, and with "set non-stop off", GDB will handle the stopping
all threads and resuming them all for you.  We call this "all-stop on top of non-stop".

Ideally we'd get to a point where GDB would enable this automatically if the remote end
supports it, but we haven't done that because the non-stop variant of the protocol is
missing a few things.  Off the top of my head:

 - async version of "O" replies.

 - Async File I/O (https://sourceware.org/gdb/current/onlinedocs/gdb.html/File_002dI_002fO-Overview.html)

 - optional: look into aggregation of stop replies, so that the server could
   say "thread 1 stopped for TRAP, all other threads suspended", explicitly without
   requiring one stop reply per thread.

If you don't care about async "O" replies and File I/O, which I'd bet you don't, since
these matter more for embedded targets, then you should be good with just enabling
"maint set target-non-stop on".  The Linux native target already works that way (backend
always in non-stop mode), btw.

Pedro Alves
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.