gdbserver: make target_pid_to_str return std::string
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 25 Oct 2021 18:33:55 +0000 (14:33 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 25 Oct 2021 18:33:55 +0000 (14:33 -0400)
I wanted to write a warning that included two target_pid_to_str calls,
like this:

    warning (_("Blabla %s, blabla %s"),
     target_pid_to_str (ptid1),
     target_pid_to_str (ptid2));

This doesn't work, because target_pid_to_str stores its result in a
static buffer, so my message would show twice the same ptid.  Change
target_pid_to_str to return an std::string to avoid this.  I don't think
we save much by using a static buffer, but it is more error-prone.

Change-Id: Ie3f649627686b84930529cc5c7c691ccf5d36dc2

gdbserver/linux-low.cc
gdbserver/remote-utils.cc
gdbserver/server.cc
gdbserver/target.cc
gdbserver/target.h
gdbserver/tracepoint.cc

index b6820adbd5656399c977623f8c2caaece5473c09..34ede238d19fb2393e9ea39be7a4e45e4ee36f4b 100644 (file)
@@ -842,7 +842,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
          struct thread_info *thr = get_lwp_thread (lwp);
 
          debug_printf ("CSBB: %s stopped by software breakpoint\n",
-                       target_pid_to_str (ptid_of (thr)));
+                       target_pid_to_str (ptid_of (thr)).c_str ());
        }
 
       /* Back up the PC if necessary.  */
@@ -863,7 +863,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
          struct thread_info *thr = get_lwp_thread (lwp);
 
          debug_printf ("CSBB: %s stopped by hardware breakpoint\n",
-                       target_pid_to_str (ptid_of (thr)));
+                       target_pid_to_str (ptid_of (thr)).c_str ());
        }
     }
   else if (lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT)
@@ -873,7 +873,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
          struct thread_info *thr = get_lwp_thread (lwp);
 
          debug_printf ("CSBB: %s stopped by hardware watchpoint\n",
-                       target_pid_to_str (ptid_of (thr)));
+                       target_pid_to_str (ptid_of (thr)).c_str ());
        }
     }
   else if (lwp->stop_reason == TARGET_STOPPED_BY_SINGLE_STEP)
@@ -883,7 +883,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
          struct thread_info *thr = get_lwp_thread (lwp);
 
          debug_printf ("CSBB: %s stopped by trace\n",
-                       target_pid_to_str (ptid_of (thr)));
+                       target_pid_to_str (ptid_of (thr)).c_str ());
        }
     }
 
@@ -1249,7 +1249,7 @@ linux_kill_one_lwp (struct lwp_info *lwp)
       int save_errno = errno;
 
       debug_printf ("LKL:  kill_lwp (SIGKILL) %s, 0, 0 (%s)\n",
-                   target_pid_to_str (ptid_of (thr)),
+                   target_pid_to_str (ptid_of (thr)).c_str (),
                    save_errno ? safe_strerror (save_errno) : "OK");
     }
 
@@ -1260,7 +1260,7 @@ linux_kill_one_lwp (struct lwp_info *lwp)
       int save_errno = errno;
 
       debug_printf ("LKL:  PTRACE_KILL %s, 0, 0 (%s)\n",
-                   target_pid_to_str (ptid_of (thr)),
+                   target_pid_to_str (ptid_of (thr)).c_str (),
                    save_errno ? safe_strerror (save_errno) : "OK");
     }
 }
@@ -1325,7 +1325,7 @@ kill_one_lwp_callback (thread_info *thread, int pid)
     {
       if (debug_threads)
        debug_printf ("lkop: is last of process %s\n",
-                     target_pid_to_str (thread->id));
+                     target_pid_to_str (thread->id).c_str ());
       return;
     }
 
@@ -1399,7 +1399,7 @@ get_detach_signal (struct thread_info *thread)
     {
       if (debug_threads)
        debug_printf ("GPS: lwp %s hasn't stopped: no pending signal\n",
-                     target_pid_to_str (ptid_of (thread)));
+                     target_pid_to_str (ptid_of (thread)).c_str ());
       return 0;
     }
 
@@ -1409,7 +1409,7 @@ get_detach_signal (struct thread_info *thread)
       if (debug_threads)
        debug_printf ("GPS: lwp %s had stopped with extended "
                      "status: no pending signal\n",
-                     target_pid_to_str (ptid_of (thread)));
+                     target_pid_to_str (ptid_of (thread)).c_str ());
       return 0;
     }
 
@@ -1419,7 +1419,7 @@ get_detach_signal (struct thread_info *thread)
     {
       if (debug_threads)
        debug_printf ("GPS: lwp %s had signal %s, but it is in nopass state\n",
-                     target_pid_to_str (ptid_of (thread)),
+                     target_pid_to_str (ptid_of (thread)).c_str (),
                      gdb_signal_to_string (signo));
       return 0;
     }
@@ -1433,7 +1433,7 @@ get_detach_signal (struct thread_info *thread)
        debug_printf ("GPS: lwp %s had signal %s, "
                      "but we don't know if we should pass it. "
                      "Default to not.\n",
-                     target_pid_to_str (ptid_of (thread)),
+                     target_pid_to_str (ptid_of (thread)).c_str (),
                      gdb_signal_to_string (signo));
       return 0;
     }
@@ -1441,7 +1441,7 @@ get_detach_signal (struct thread_info *thread)
     {
       if (debug_threads)
        debug_printf ("GPS: lwp %s has pending signal %s: delivering it.\n",
-                     target_pid_to_str (ptid_of (thread)),
+                     target_pid_to_str (ptid_of (thread)).c_str (),
                      gdb_signal_to_string (signo));
 
       return WSTOPSIG (status);
@@ -1460,7 +1460,7 @@ linux_process_target::detach_one_lwp (lwp_info *lwp)
     {
       if (debug_threads)
        debug_printf ("Sending SIGCONT to %s\n",
-                     target_pid_to_str (ptid_of (thread)));
+                     target_pid_to_str (ptid_of (thread)).c_str ());
 
       kill_lwp (lwpid_of (thread), SIGCONT);
       lwp->stop_expected = 0;
@@ -1516,14 +1516,14 @@ linux_process_target::detach_one_lwp (lwp_info *lwp)
       else
        {
          error (_("Can't detach %s: %s"),
-                target_pid_to_str (ptid_of (thread)),
+                target_pid_to_str (ptid_of (thread)).c_str (),
                 safe_strerror (save_errno));
        }
     }
   else if (debug_threads)
     {
       debug_printf ("PTRACE_DETACH (%s, %s, 0) (OK)\n",
-                   target_pid_to_str (ptid_of (thread)),
+                   target_pid_to_str (ptid_of (thread)).c_str (),
                    strsignal (sig));
     }
 
@@ -2410,7 +2410,7 @@ linux_process_target::filter_event (int lwpid, int wstat)
             SIGSTOP as a normal event.  */
          if (debug_threads)
            debug_printf ("LLW: resume_stop SIGSTOP caught for %s.\n",
-                         target_pid_to_str (ptid_of (thread)));
+                         target_pid_to_str (ptid_of (thread)).c_str ());
        }
       else if (stopping_threads != NOT_STOPPING_THREADS)
        {
@@ -2419,7 +2419,7 @@ linux_process_target::filter_event (int lwpid, int wstat)
          if (debug_threads)
            debug_printf ("LLW: SIGSTOP caught for %s "
                          "while stopping threads.\n",
-                         target_pid_to_str (ptid_of (thread)));
+                         target_pid_to_str (ptid_of (thread)).c_str ());
          return;
        }
       else
@@ -2428,7 +2428,7 @@ linux_process_target::filter_event (int lwpid, int wstat)
          if (debug_threads)
            debug_printf ("LLW: %s %s, 0, 0 (discard delayed SIGSTOP)\n",
                          child->stepping ? "step" : "continue",
-                         target_pid_to_str (ptid_of (thread)));
+                         target_pid_to_str (ptid_of (thread)).c_str ());
 
          resume_one_lwp (child, child->stepping, 0, NULL);
          return;
@@ -2471,7 +2471,7 @@ linux_process_target::resume_stopped_resumed_lwps (thread_info *thread)
 
       if (debug_threads)
        debug_printf ("RSRL: resuming stopped-resumed LWP %s at %s: step=%d\n",
-                     target_pid_to_str (ptid_of (thread)),
+                     target_pid_to_str (ptid_of (thread)).c_str (),
                      paddress (lp->stop_pc),
                      step);
 
@@ -2717,7 +2717,7 @@ select_event_lwp (struct lwp_info **orig_lp)
        {
          if (debug_threads)
            debug_printf ("SEL: Select single-step %s\n",
-                         target_pid_to_str (ptid_of (event_thread)));
+                         target_pid_to_str (ptid_of (event_thread)).c_str ());
        }
     }
   if (event_thread == NULL)
@@ -2952,7 +2952,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
   if (debug_threads)
     {
       debug_enter ();
-      debug_printf ("wait_1: [%s]\n", target_pid_to_str (ptid));
+      debug_printf ("wait_1: [%s]\n", target_pid_to_str (ptid).c_str ());
     }
 
   /* Translate generic target options into linux options.  */
@@ -2989,7 +2989,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
     {
       if (debug_threads)
        debug_printf ("step_over_bkpt set [%s], doing a blocking wait\n",
-                     target_pid_to_str (step_over_bkpt));
+                     target_pid_to_str (step_over_bkpt).c_str ());
       pid = wait_for_event (step_over_bkpt, &w, options & ~WNOHANG);
     }
 
@@ -3034,7 +3034,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
            {
              debug_printf ("wait_1 ret = %s, exited with "
                            "retcode %d\n",
-                           target_pid_to_str (ptid_of (current_thread)),
+                           target_pid_to_str (ptid_of (current_thread)).c_str (),
                            WEXITSTATUS (w));
              debug_exit ();
            }
@@ -3047,7 +3047,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
            {
              debug_printf ("wait_1 ret = %s, terminated with "
                            "signal %d\n",
-                           target_pid_to_str (ptid_of (current_thread)),
+                           target_pid_to_str (ptid_of (current_thread)).c_str (),
                            WTERMSIG (w));
              debug_exit ();
            }
@@ -3085,7 +3085,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
       if (debug_threads)
        {
          debug_printf ("step-over for %s executed software breakpoint\n",
-                       target_pid_to_str (ptid_of (current_thread)));
+                       target_pid_to_str (ptid_of (current_thread)).c_str ());
        }
 
       if (increment_pc != 0)
@@ -3254,7 +3254,8 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
                    {
                      debug_printf ("wait_1 ret = %s, stopped "
                                    "while stabilizing threads\n",
-                                   target_pid_to_str (ptid_of (current_thread)));
+                                   target_pid_to_str
+                                     (ptid_of (current_thread)).c_str ());
                      debug_exit ();
                    }
 
@@ -3658,7 +3659,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
   if (debug_threads)
     {
       debug_printf ("wait_1 ret = %s, %d, %d\n",
-                   target_pid_to_str (ptid_of (current_thread)),
+                   target_pid_to_str (ptid_of (current_thread)).c_str (),
                    ourstatus->kind (), ourstatus->sig ());
       debug_exit ();
     }
@@ -3969,9 +3970,10 @@ linux_process_target::stop_all_lwps (int suspend, lwp_info *except)
       debug_enter ();
       debug_printf ("stop_all_lwps (%s, except=%s)\n",
                    suspend ? "stop-and-suspend" : "stop",
-                   except != NULL
-                   ? target_pid_to_str (ptid_of (get_lwp_thread (except)))
-                   : "none");
+                   (except != NULL
+                    ? target_pid_to_str
+                        (ptid_of (get_lwp_thread (except))).c_str ()
+                    : "none"));
     }
 
   stopping_threads = (suspend
index a4cc3267996ec390a042114e572e6bfd7902a50c..5bc261a9c7b5b75a01f076bbcf2449a5327f5085 100644 (file)
@@ -1087,7 +1087,7 @@ prepare_resume_reply (char *buf, ptid_t ptid,
   client_state &cs = get_client_state ();
   if (debug_threads)
     debug_printf ("Writing resume reply for %s:%d\n",
-                 target_pid_to_str (ptid), status->kind ());
+                 target_pid_to_str (ptid).c_str (), status->kind ());
 
   switch (status->kind ())
     {
index 2cb378ce9c911d714ed56697044f2b68dd277d78..c58f7e01d8da910bbed96c6cf5e8f785e11fcb65 100644 (file)
@@ -3310,7 +3310,7 @@ queue_stop_reply_callback (thread_info *thread)
                = target_waitstatus_to_string (&thread->last_status);
 
              debug_printf ("Reporting thread %s as already stopped with %s\n",
-                           target_pid_to_str (thread->id),
+                           target_pid_to_str (thread->id).c_str (),
                            status_string.c_str ());
            }
 
@@ -4640,7 +4640,7 @@ handle_target_event (int err, gdb_client_data client_data)
                debug_printf ("GDB not connected; forwarding event %d for"
                              " [%s]\n",
                              (int) cs.last_status.kind (),
-                             target_pid_to_str (cs.last_ptid));
+                             target_pid_to_str (cs.last_ptid).c_str ());
 
              if (cs.last_status.kind () == TARGET_WAITKIND_STOPPED)
                signal = cs.last_status.sig ();
index b6a1cb24025d0e3fdd1ca3ba3a6e5934e1e008c5..bfa860546a0a96a931947ef0dab11b6775707e4a 100644 (file)
@@ -276,26 +276,23 @@ set_target_ops (process_stratum_target *target)
 
 /* Convert pid to printable format.  */
 
-const char *
+std::string
 target_pid_to_str (ptid_t ptid)
 {
-  static char buf[80];
-
   if (ptid == minus_one_ptid)
-    xsnprintf (buf, sizeof (buf), "<all threads>");
+    return string_printf("<all threads>");
   else if (ptid == null_ptid)
-    xsnprintf (buf, sizeof (buf), "<null thread>");
+    return string_printf("<null thread>");
   else if (ptid.tid () != 0)
-    xsnprintf (buf, sizeof (buf), "Thread %d.0x%s",
-              ptid.pid (), phex_nz (ptid.tid (), sizeof (ULONGEST)));
+    return string_printf("Thread %d.0x%s",
+                        ptid.pid (),
+                        phex_nz (ptid.tid (), sizeof (ULONGEST)));
   else if (ptid.lwp () != 0)
-    xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
-              ptid.pid (), ptid.lwp ());
+    return string_printf("LWP %d.%ld",
+                        ptid.pid (), ptid.lwp ());
   else
-    xsnprintf (buf, sizeof (buf), "Process %d",
-              ptid.pid ());
-
-  return buf;
+    return string_printf("Process %d",
+                        ptid.pid ());
 }
 
 int
index 2c4393ec8c61a20d36392bb5f7e6277109a2d627..6c863c84666a3544f30a84864bc00dc4655c2871 100644 (file)
@@ -702,6 +702,6 @@ int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);
 
 int set_desired_thread ();
 
-const char *target_pid_to_str (ptid_t);
+std::string target_pid_to_str (ptid_t);
 
 #endif /* GDBSERVER_TARGET_H */
index bc8fb267e90b8f9a675db6a25199cc9dae7b7636..c01973b5e61fceaa2c14d4076a06b01338dc3383 100644 (file)
@@ -4408,7 +4408,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
   wstep_link = &tinfo->while_stepping;
 
   trace_debug ("Thread %s finished a single-step for tracepoint %d at 0x%s",
-              target_pid_to_str (tinfo->id),
+              target_pid_to_str (tinfo->id).c_str (),
               wstep->tp_number, paddress (wstep->tp_address));
 
   ctx.base.type = trap_tracepoint;
@@ -4421,7 +4421,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
        {
          trace_debug ("NO TRACEPOINT %d at 0x%s FOR THREAD %s!",
                       wstep->tp_number, paddress (wstep->tp_address),
-                      target_pid_to_str (tinfo->id));
+                      target_pid_to_str (tinfo->id).c_str ());
 
          /* Unlink.  */
          *wstep_link = wstep->next;
@@ -4441,7 +4441,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
        {
          /* The requested numbers of steps have occurred.  */
          trace_debug ("Thread %s done stepping for tracepoint %d at 0x%s",
-                      target_pid_to_str (tinfo->id),
+                      target_pid_to_str (tinfo->id).c_str (),
                       wstep->tp_number, paddress (wstep->tp_address));
 
          /* Unlink the wstep.  */
@@ -4588,7 +4588,7 @@ tracepoint_was_hit (struct thread_info *tinfo, CORE_ADDR stop_pc)
          && tpoint->type != static_tracepoint)
        {
          trace_debug ("Thread %s at address of tracepoint %d at 0x%s",
-                      target_pid_to_str (tinfo->id),
+                      target_pid_to_str (tinfo->id).c_str (),
                       tpoint->number, paddress (tpoint->address));
 
          /* Test the condition if present, and collect if true.  */