Message ID | 20241024200031.80327-2-iii@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | gdbstub: Allow late attachment | expand |
On 10/24/24 20:59, Ilya Leoshkevich wrote: > Just like for QEMU_LOG_FILENAME, replace %d with PID in the GDB socket > path. This allows running multi-process applications with, e.g., > export QEMU_GDB=/tmp/qemu-%d.sock. Currently this is not possible, > since the first process will cause the subsequent ones to fail due to > not being able to bind() the GDB socket. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > gdbstub/user.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/gdbstub/user.c b/gdbstub/user.c > index 0b4bfa9c488..cdf5affae15 100644 > --- a/gdbstub/user.c > +++ b/gdbstub/user.c > @@ -316,9 +316,19 @@ static bool gdb_accept_socket(int gdb_fd) > > static int gdbserver_open_socket(const char *path) > { > + g_autoptr(GString) buf = g_string_new(""); > struct sockaddr_un sockaddr = {}; > + char *pid_placeholder; > int fd, ret; > > + pid_placeholder = strstr(path, "%d"); > + if (pid_placeholder != NULL) { > + g_string_append_len(buf, path, pid_placeholder - path); > + g_string_append_printf(buf, "%d", getpid()); qemu_get_thread_id(). Otherwise, Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
On Tue, Nov 5, 2024 at 7:41 AM Richard Henderson < richard.henderson@linaro.org> wrote: > On 10/24/24 20:59, Ilya Leoshkevich wrote: > > Just like for QEMU_LOG_FILENAME, replace %d with PID in the GDB socket > > path. This allows running multi-process applications with, e.g., > > export QEMU_GDB=/tmp/qemu-%d.sock. Currently this is not possible, > > since the first process will cause the subsequent ones to fail due to > > not being able to bind() the GDB socket. > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > > --- > > gdbstub/user.c | 10 ++++++++++ > > 1 file changed, 10 insertions(+) > > > > diff --git a/gdbstub/user.c b/gdbstub/user.c > > index 0b4bfa9c488..cdf5affae15 100644 > > --- a/gdbstub/user.c > > +++ b/gdbstub/user.c > > @@ -316,9 +316,19 @@ static bool gdb_accept_socket(int gdb_fd) > > > > static int gdbserver_open_socket(const char *path) > > { > > + g_autoptr(GString) buf = g_string_new(""); > > struct sockaddr_un sockaddr = {}; > > + char *pid_placeholder; > > int fd, ret; > > > > + pid_placeholder = strstr(path, "%d"); > > + if (pid_placeholder != NULL) { > > + g_string_append_len(buf, path, pid_placeholder - path); > > + g_string_append_printf(buf, "%d", getpid()); > > qemu_get_thread_id(). > > Otherwise, > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > Same. Reviewed-by: Warner Losh <imp@bsdimp.com>
diff --git a/gdbstub/user.c b/gdbstub/user.c index 0b4bfa9c488..cdf5affae15 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -316,9 +316,19 @@ static bool gdb_accept_socket(int gdb_fd) static int gdbserver_open_socket(const char *path) { + g_autoptr(GString) buf = g_string_new(""); struct sockaddr_un sockaddr = {}; + char *pid_placeholder; int fd, ret; + pid_placeholder = strstr(path, "%d"); + if (pid_placeholder != NULL) { + g_string_append_len(buf, path, pid_placeholder - path); + g_string_append_printf(buf, "%d", getpid()); + g_string_append(buf, pid_placeholder + 2); + path = buf->str; + } + fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { perror("create socket");
Just like for QEMU_LOG_FILENAME, replace %d with PID in the GDB socket path. This allows running multi-process applications with, e.g., export QEMU_GDB=/tmp/qemu-%d.sock. Currently this is not possible, since the first process will cause the subsequent ones to fail due to not being able to bind() the GDB socket. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- gdbstub/user.c | 10 ++++++++++ 1 file changed, 10 insertions(+)