From 8d06918ff58452cb17d1bdfbde7187f45933f42e Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sat, 8 May 2021 21:06:41 -0400 Subject: [PATCH] gdb, gdbserver: make status_to_str return std::string Instead of using a static buffer. This is safer, and we don't really mind about any extra dynamic allocation here, since it's only used for debug purposes. gdb/ChangeLog: * nat/linux-waitpid.c (status_to_str): Return std::string. * nat/linux-waitpid.h (status_to_str): Likewise. * linux-nat.c (linux_nat_post_attach_wait): Adjust. (linux_nat_target::attach): Adjust. (linux_handle_extended_wait): Adjust. (wait_lwp): Adjust. (stop_wait_callback): Adjust. (linux_nat_filter_event): Adjust. (linux_nat_wait_1): Adjust. * nat/linux-waitpid.c (status_to_str): Adjust. * nat/linux-waitpid.h (status_to_str): Adjust. gdbserver/ChangeLog: * linux-low.cc (linux_process_target::wait_for_event_filtered): Adjust to status_to_str returning std::string. Change-Id: Ia8aead70270438a5690f243e6faafff6c38ff757 --- gdb/ChangeLog | 14 ++++++++++++++ gdb/linux-nat.c | 20 +++++++++++--------- gdb/nat/linux-waitpid.c | 23 +++++++++-------------- gdb/nat/linux-waitpid.h | 2 +- gdbserver/ChangeLog | 5 +++++ gdbserver/linux-low.cc | 2 +- 6 files changed, 41 insertions(+), 25 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e7e48f0cc3e..75e344ff707 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2021-05-08 Simon Marchi + + * nat/linux-waitpid.c (status_to_str): Return std::string. + * nat/linux-waitpid.h (status_to_str): Likewise. + * linux-nat.c (linux_nat_post_attach_wait): Adjust. + (linux_nat_target::attach): Adjust. + (linux_handle_extended_wait): Adjust. + (wait_lwp): Adjust. + (stop_wait_callback): Adjust. + (linux_nat_filter_event): Adjust. + (linux_nat_wait_1): Adjust. + * nat/linux-waitpid.c (status_to_str): Adjust. + * nat/linux-waitpid.h (status_to_str): Adjust. + 2021-05-08 Simon Marchi * infrun.h (infrun_debug_printf): Add missing space. diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index e595c71c3d3..34a2aee41d7 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1061,7 +1061,7 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) { /* The pid we tried to attach has apparently just exited. */ linux_nat_debug_printf ("Failed to stop %d: %s", pid, - status_to_str (status)); + status_to_str (status).c_str ()); return status; } @@ -1069,7 +1069,7 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) { *signalled = 1; linux_nat_debug_printf ("Received %s after attaching", - status_to_str (status)); + status_to_str (status).c_str ()); } return status; @@ -1239,7 +1239,8 @@ linux_nat_target::attach (const char *args, int from_tty) /* Save the wait status to report later. */ lp->resumed = 1; linux_nat_debug_printf ("waitpid %ld, saving status %s", - (long) lp->ptid.pid (), status_to_str (status)); + (long) lp->ptid.pid (), + status_to_str (status).c_str ()); lp->status = status; @@ -2005,7 +2006,7 @@ linux_handle_extended_wait (struct lwp_info *lp, int status) /* Save the wait status to report later. */ linux_nat_debug_printf ("waitpid of new LWP %ld, saving status %s", - (long) new_lp->ptid.lwp (), status_to_str (status)); + (long) new_lp->ptid.lwp (), status_to_str (status).c_str ()); new_lp->status = status; } else if (report_thread_events) @@ -2153,7 +2154,7 @@ wait_lwp (struct lwp_info *lp) linux_nat_debug_printf ("waitpid %s received %s", target_pid_to_str (lp->ptid).c_str (), - status_to_str (status)); + status_to_str (status).c_str ()); /* Check if the thread has exited. */ if (WIFEXITED (status) || WIFSIGNALED (status)) @@ -2440,7 +2441,7 @@ stop_wait_callback (struct lwp_info *lp) /* The thread was stopped with a signal other than SIGSTOP. */ linux_nat_debug_printf ("Pending event %s in %s", - status_to_str ((int) status), + status_to_str ((int) status).c_str (), target_pid_to_str (lp->ptid).c_str ()); /* Save the sigtrap event. */ @@ -2859,7 +2860,7 @@ linux_nat_filter_event (int lwpid, int status) if (WIFSTOPPED (status) && !lp) { linux_nat_debug_printf ("saving LWP %ld status %s in stopped_pids list", - (long) lwpid, status_to_str (status)); + (long) lwpid, status_to_str (status).c_str ()); add_to_pid_list (&stopped_pids, lwpid, status); return; } @@ -3152,7 +3153,7 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus, if (lp != NULL) { linux_nat_debug_printf ("Using pending wait status %s for %s.", - status_to_str (lp->status), + status_to_str (lp->status).c_str (), target_pid_to_str (lp->ptid).c_str ()); } @@ -3187,7 +3188,8 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus, if (lwpid > 0) { linux_nat_debug_printf ("waitpid %ld received %s", - (long) lwpid, status_to_str (status)); + (long) lwpid, + status_to_str (status).c_str ()); linux_nat_filter_event (lwpid, status); /* Retry until nothing comes out of waitpid. A single diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index 2d4c8eb5812..f205df7a246 100644 --- a/gdb/nat/linux-waitpid.c +++ b/gdb/nat/linux-waitpid.c @@ -24,30 +24,25 @@ #include "gdbsupport/gdb_wait.h" #include "gdbsupport/eintr.h" -/* Convert wait status STATUS to a string. Used for printing debug - messages only. */ +/* See linux-waitpid.h. */ -char * +std::string status_to_str (int status) { - static char buf[64]; - if (WIFSTOPPED (status)) { if (WSTOPSIG (status) == SYSCALL_SIGTRAP) - snprintf (buf, sizeof (buf), "%s (stopped at syscall)", - strsignal (SIGTRAP)); + return string_printf ("%s (stopped at syscall)", + strsignal (SIGTRAP)); else - snprintf (buf, sizeof (buf), "%s (stopped)", - strsignal (WSTOPSIG (status))); + return string_printf ("%s (stopped)", + strsignal (WSTOPSIG (status))); } else if (WIFSIGNALED (status)) - snprintf (buf, sizeof (buf), "%s (terminated)", - strsignal (WTERMSIG (status))); + return string_printf ("%s (terminated)", + strsignal (WTERMSIG (status))); else - snprintf (buf, sizeof (buf), "%d (exited)", WEXITSTATUS (status)); - - return buf; + return string_printf ("%d (exited)", WEXITSTATUS (status)); } /* See linux-waitpid.h. */ diff --git a/gdb/nat/linux-waitpid.h b/gdb/nat/linux-waitpid.h index 78056454da6..fe2383f1386 100644 --- a/gdb/nat/linux-waitpid.h +++ b/gdb/nat/linux-waitpid.h @@ -25,6 +25,6 @@ extern int my_waitpid (int pid, int *status, int flags); /* Convert wait status STATUS to a string. Used for printing debug messages only. */ -extern char *status_to_str (int status); +extern std::string status_to_str (int status); #endif /* NAT_LINUX_WAITPID_H */ diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index 6483d65700c..7e7e3f29980 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2021-05-08 Simon Marchi + + * linux-low.cc (linux_process_target::wait_for_event_filtered): + Adjust to status_to_str returning std::string. + 2021-05-08 Pedro Alves * linux-low.cc: diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 9debe894eeb..5c6191d941c 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -2601,7 +2601,7 @@ linux_process_target::wait_for_event_filtered (ptid_t wait_ptid, if (debug_threads) { debug_printf ("LLW: waitpid %ld received %s\n", - (long) ret, status_to_str (*wstatp)); + (long) ret, status_to_str (*wstatp).c_str ()); } /* Filter all events. IOW, leave all events pending. We'll -- 2.30.2