This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Make linux_ptrace_attach_fail_reason return an std::string


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4d9b86e17505063c96a01d40cdf5b4fc2080a798

commit 4d9b86e17505063c96a01d40cdf5b4fc2080a798
Author: Simon Marchi <simon.marchi@ericsson.com>
Date:   Wed Jan 17 12:33:57 2018 -0500

    Make linux_ptrace_attach_fail_reason return an std::string
    
    This patch makes linux_ptrace_attach_fail_reason and
    linux_ptrace_attach_fail_reason_string return std::string.  It also
    replaces usages of struct buffer with std::string.  This allows getting
    rid of a cleanup in in linux_ptrace_attach_fail_reason_string and
    simplifies the code in general.
    
    Something that looks odd to me is that in
    linux_ptrace_attach_fail_reason, if the two messages are appended, there
    is no separating space or \n, so the result won't be very nice.  I left
    it as-is for now though.
    
    gdb/ChangeLog:
    
    	* nat/linux-ptrace.h (linux_ptrace_attach_fail_reason): Return
    	std::string.
    	(linux_ptrace_attach_fail_reason_string): Likewise.
    	* nat/linux-ptrace.c (linux_ptrace_attach_fail_reason):
    	Likewise.
    	(linux_ptrace_attach_fail_reason_string): Likewise.
    	* linux-nat.c (attach_proc_task_lwp_callback): Adjust.
    
    gdb/gdbserver/ChangeLog:
    
    	* linux-low.c (attach_proc_task_lwp_callback): Adjust to
    	linux_ptrace_attach_fail_reason_string now returning an
    	std::string.
    	(linux_attach): Likewise.
    	* thread-db.c (attach_thread): Likewise.

Diff:
---
 gdb/ChangeLog             | 10 +++++++++
 gdb/gdbserver/ChangeLog   |  8 +++++++
 gdb/gdbserver/linux-low.c | 14 +++++++-----
 gdb/gdbserver/thread-db.c |  6 ++++--
 gdb/linux-nat.c           | 21 ++++++------------
 gdb/nat/linux-ptrace.c    | 55 ++++++++++++++++++++---------------------------
 gdb/nat/linux-ptrace.h    |  8 +++----
 7 files changed, 64 insertions(+), 58 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2a75839..bfd3492 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
 2018-01-17  Simon Marchi  <simon.marchi@ericsson.com>
 
+	* nat/linux-ptrace.h (linux_ptrace_attach_fail_reason): Return
+	std::string.
+	(linux_ptrace_attach_fail_reason_string): Likewise.
+	* nat/linux-ptrace.c (linux_ptrace_attach_fail_reason):
+	Likewise.
+	(linux_ptrace_attach_fail_reason_string): Likewise.
+	* linux-nat.c (attach_proc_task_lwp_callback): Adjust.
+
+2018-01-17  Simon Marchi  <simon.marchi@ericsson.com>
+
 	* linux-nat.c (linux_nat_attach): Remove xstrdup.
 
 2018-01-17  Eldar Abusalimov  <eldar.abusalimov@jetbrains.com>
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index d91e004..f183655 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,11 @@
+2018-01-17  Simon Marchi  <simon.marchi@ericsson.com>
+
+	* linux-low.c (attach_proc_task_lwp_callback): Adjust to
+	linux_ptrace_attach_fail_reason_string now returning an
+	std::string.
+	(linux_attach): Likewise.
+	* thread-db.c (attach_thread): Likewise.
+
 2018-01-17  Eldar Abusalimov  <eldar.abusalimov@jetbrains.com>
 
 	PR gdb/21559
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index d8e1226..8117fc6 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -1159,9 +1159,10 @@ attach_proc_task_lwp_callback (ptid_t ptid)
 	}
       else if (err != 0)
 	{
-	  warning (_("Cannot attach to lwp %d: %s"),
-		   lwpid,
-		   linux_ptrace_attach_fail_reason_string (ptid, err));
+	  std::string reason
+	    = linux_ptrace_attach_fail_reason_string (ptid, err);
+
+	  warning (_("Cannot attach to lwp %d: %s"), lwpid, reason.c_str ());
 	}
 
       return 1;
@@ -1186,8 +1187,11 @@ linux_attach (unsigned long pid)
      soon.  */
   err = linux_attach_lwp (ptid);
   if (err != 0)
-    error ("Cannot attach to process %ld: %s",
-	   pid, linux_ptrace_attach_fail_reason_string (ptid, err));
+    {
+      std::string reason = linux_ptrace_attach_fail_reason_string (ptid, err);
+
+      error ("Cannot attach to process %ld: %s", pid, reason.c_str ());
+    }
 
   proc = linux_add_process (pid, 1);
 
diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c
index 6829fcc..812aa0f 100644
--- a/gdb/gdbserver/thread-db.c
+++ b/gdb/gdbserver/thread-db.c
@@ -225,9 +225,11 @@ attach_thread (const td_thrhandle_t *th_p, td_thrinfo_t *ti_p)
   err = linux_attach_lwp (ptid);
   if (err != 0)
     {
+      std::string reason = linux_ptrace_attach_fail_reason_string (ptid, err);
+
       warning ("Could not attach to thread %ld (LWP %d): %s\n",
-	       (unsigned long) ti_p->ti_tid, ti_p->ti_lid,
-	       linux_ptrace_attach_fail_reason_string (ptid, err));
+	       (unsigned long) ti_p->ti_tid, ti_p->ti_lid, reason.c_str ());
+
       return 0;
     }
 
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index d26ab7d..a47c496 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -1167,10 +1167,11 @@ attach_proc_task_lwp_callback (ptid_t ptid)
 	    }
 	  else
 	    {
+	      std::string reason
+		= linux_ptrace_attach_fail_reason_string (ptid, err);
+
 	      warning (_("Cannot attach to lwp %d: %s"),
-		       lwpid,
-		       linux_ptrace_attach_fail_reason_string (ptid,
-							       err));
+		       lwpid, reason.c_str ());
 	    }
 	}
       else
@@ -1223,18 +1224,10 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
   CATCH (ex, RETURN_MASK_ERROR)
     {
       pid_t pid = parse_pid_to_attach (args);
-      struct buffer buffer;
-      char *buffer_s;
-
-      buffer_init (&buffer);
-      linux_ptrace_attach_fail_reason (pid, &buffer);
-
-      buffer_grow_str0 (&buffer, "");
-      buffer_s = buffer_finish (&buffer);
-      make_cleanup (xfree, buffer_s);
+      std::string reason = linux_ptrace_attach_fail_reason (pid);
 
-      if (*buffer_s != '\0')
-	throw_error (ex.error, "warning: %s\n%s", buffer_s, ex.message);
+      if (!reason.empty ())
+	throw_error (ex.error, "warning: %s\n%s", reason.c_str (), ex.message);
       else
 	throw_error (ex.error, "%s", ex.message);
     }
diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c
index ac6ba72..5c4ddc9 100644
--- a/gdb/nat/linux-ptrace.c
+++ b/gdb/nat/linux-ptrace.c
@@ -32,51 +32,42 @@
    of 0 means there are no supported features.  */
 static int supported_ptrace_options = -1;
 
-/* Find all possible reasons we could fail to attach PID and append
-   these as strings to the already initialized BUFFER.  '\0'
-   termination of BUFFER must be done by the caller.  */
+/* Find all possible reasons we could fail to attach PID and return these
+   as a string.  An empty string is returned if we didn't find any reason.  */
 
-void
-linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer)
+std::string
+linux_ptrace_attach_fail_reason (pid_t pid)
 {
-  pid_t tracerpid;
+  pid_t tracerpid = linux_proc_get_tracerpid_nowarn (pid);
+  std::string result;
 
-  tracerpid = linux_proc_get_tracerpid_nowarn (pid);
   if (tracerpid > 0)
-    buffer_xml_printf (buffer, _("process %d is already traced "
-				 "by process %d"),
-		       (int) pid, (int) tracerpid);
+    string_appendf (result,
+		    _("process %d is already traced by process %d"),
+		    (int) pid, (int) tracerpid);
 
   if (linux_proc_pid_is_zombie_nowarn (pid))
-    buffer_xml_printf (buffer, _("process %d is a zombie "
-				 "- the process has already terminated"),
-		       (int) pid);
+    string_appendf (result,
+		    _("process %d is a zombie - the process has already "
+		      "terminated"),
+		    (int) pid);
+
+  return result;
 }
 
 /* See linux-ptrace.h.  */
 
-char *
+std::string
 linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err)
 {
-  static char *reason_string;
-  struct buffer buffer;
-  char *warnings;
-  long lwpid = ptid_get_lwp (ptid);
-
-  xfree (reason_string);
-
-  buffer_init (&buffer);
-  linux_ptrace_attach_fail_reason (lwpid, &buffer);
-  buffer_grow_str0 (&buffer, "");
-  warnings = buffer_finish (&buffer);
-  if (warnings[0] != '\0')
-    reason_string = xstrprintf ("%s (%d), %s",
-				safe_strerror (err), err, warnings);
+  long lwpid = ptid.lwp ();
+  std::string reason = linux_ptrace_attach_fail_reason (lwpid);
+
+  if (!reason.empty ())
+    return string_printf ("%s (%d), %s", safe_strerror (err), err,
+			  reason.c_str ());
   else
-    reason_string = xstrprintf ("%s (%d)",
-				safe_strerror (err), err);
-  xfree (warnings);
-  return reason_string;
+    return string_printf ("%s (%d)", safe_strerror (err), err);
 }
 
 #if defined __i386__ || defined __x86_64__
diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h
index 1f960ed..60967a3 100644
--- a/gdb/nat/linux-ptrace.h
+++ b/gdb/nat/linux-ptrace.h
@@ -180,14 +180,12 @@ struct buffer;
 # define TRAP_HWBKPT 4
 #endif
 
-extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer);
+extern std::string linux_ptrace_attach_fail_reason (pid_t pid);
 
 /* Find all possible reasons we could have failed to attach to PTID
    and return them as a string.  ERR is the error PTRACE_ATTACH failed
-   with (an errno).  The result is stored in a static buffer.  This
-   string should be copied into a buffer by the client if the string
-   will not be immediately used, or if it must persist.  */
-extern char *linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err);
+   with (an errno).  */
+extern std::string linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err);
 
 extern void linux_ptrace_init_warnings (void);
 extern void linux_check_ptrace_features (void);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]