diff mbox series

[1/8] gdbstub: Allow the %d placeholder in the socket path

Message ID 20241024200031.80327-2-iii@linux.ibm.com (mailing list archive)
State New
Headers show
Series gdbstub: Allow late attachment | expand

Commit Message

Ilya Leoshkevich Oct. 24, 2024, 7:59 p.m. UTC
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(+)

Comments

Richard Henderson Nov. 5, 2024, 2:41 p.m. UTC | #1
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~
Warner Losh Nov. 5, 2024, 3:04 p.m. UTC | #2
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 mbox series

Patch

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");