Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Will Huang" <will.huang@aliyun-inc.com>
To: "'Yao Qi'" <yao@codesourcery.com>,	<palves@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: RE: [PATCH][PR threads/15824] when get threads name failed from info threads with linux kernel version earlier than 2.6.33
Date: Mon, 19 Aug 2013 02:52:00 -0000	[thread overview]
Message-ID: <000301ce9c87$19927630$4cb76290$@huang@aliyun-inc.com> (raw)
In-Reply-To: <520E0CFB.9010203@codesourcery.com>

Thanks Yao,
Ok, switch to mainline. Patch is updated, please review it again. Thanks.

diff -ruN ./gdb.org/ChangeLog ./gdb/ChangeLog
--- ./gdb.org/ChangeLog 2013-08-16 12:30:22.000000000 +0800
+++ ./gdb/ChangeLog     2013-08-19 09:39:32.000000000 +0800
@@ -1,3 +1,11 @@
+2013-08-14  Will Huang  <will.huang@aliyun-inc.com>
+
+       PR threads/15824
+       * linux-nat.c (linux_nat_thread_name): Add get thread name from
+       procfs "/proc/$pid/task/$tid/status".
+       * commo/linux-procfs.c (linux_proc_get_thread_name): New.
+       (linux_proc_get_string): New.
+
 2013-08-15  Kevin Buettner  <kevinb@redhat.com>

        * rl78-tdep.c (RL78_RAW_PC_REGNUM): New enum.
diff -ruN ./gdb.org/common/linux-procfs.c ./gdb/common/linux-procfs.c
--- ./gdb.org/common/linux-procfs.c     2013-04-23 00:46:15.000000000 +0800
+++ ./gdb/common/linux-procfs.c 2013-08-19 10:32:55.000000000 +0800
@@ -56,6 +56,57 @@
   return retval;
 }

+
+/* Return the string length of FILED /proc/LWPID/task/TID/status.
+   Return -1 if not found.  */
+
+static int
+linux_proc_get_string (pid_t lwpid, pid_t tid, char *target,
+                      size_t t_size, const char *field)
+{
+  size_t field_len = strlen (field);
+  FILE *status_file;
+  char buf[100];
+  int retval = -1;
+
+  if (tid > 0)
+    xsnprintf (buf, sizeof (buf), "/proc/%d/task/%d/status",
+              (int) lwpid, (int) tid);
+  else
+    {
+      /*if TID is zero, ingnore it */
+      xsnprintf (buf, sizeof (buf), "/proc/%d/status", (int) lwpid);
+    }
+
+  status_file = gdb_fopen_cloexec (buf, "r");
+  if (status_file == NULL)
+    {
+      warning (_("unable to open /proc file '%s'"), buf);
+      return -1;
+    }
+
+  while (fgets (buf, sizeof (buf), status_file))
+    if (strncmp (buf, field, field_len) == 0 && buf[field_len] == ':')
+      {
+       size_t pos = field_len + 1;
+
+       while ((buf[pos] == ' ' || buf[pos] == '\t')
+              && (pos < sizeof (buf) - 1))
+         pos++;
+
+       strncpy (target, &buf[pos], t_size);
+       target[t_size - 1] = '\0';
+       retval = strlen (target);
+       if (retval > 0 && target[retval - 1] == '\n')
+         target[retval - 1] = '\0';
+
+       break;
+      }
+
+  fclose (status_file);
+  return retval;
+}
+
 /* Return the TGID of LWPID from /proc/pid/status.  Returns -1 if not
    found.  */

@@ -119,3 +170,13 @@
 {
   return linux_proc_pid_has_state (pid, "Z (zombie)");
 }
+
+/* Save the name of thread PID/TID into buffer NAME.  SIZE is the size
+   of buffer NAME.  Return the length of the name if success,
+   otherwise return -1.  */
+
+int
+linux_proc_get_thread_name (pid_t pid, pid_t tid, char *name, size_t size)
+{
+  return linux_proc_get_string (pid, tid, name, size, "Name");
+}
diff -ruN ./gdb.org/common/linux-procfs.h ./gdb/common/linux-procfs.h
--- ./gdb.org/common/linux-procfs.h     2013-01-01 14:32:54.000000000 +0800
+++ ./gdb/common/linux-procfs.h 2013-08-19 10:32:57.000000000 +0800
@@ -40,4 +40,10 @@

 extern int linux_proc_pid_is_zombie (pid_t pid);

+/* Save the name of thread PID/TID into buffer NAME.  SIZE is the size
+   of buffer NAME.  Return the length of the name if success,
+   otherwise return -1.  */
+
+extern int linux_proc_get_thread_name (pid_t pid, pid_t tid,
+                                      char *name, size_t size);
 #endif /* COMMON_LINUX_PROCFS_H */
diff -ruN ./gdb.org/linux-nat.c ./gdb/linux-nat.c
--- ./gdb.org/linux-nat.c       2013-07-01 19:28:30.000000000 +0800
+++ ./gdb/linux-nat.c   2013-08-19 09:45:34.000000000 +0800
@@ -4291,6 +4291,17 @@
       fclose (comm_file);
     }

+  else
+    {
+      static char comm[COMM_LEN + 1];
+      int size = linux_proc_get_thread_name ((pid_t) pid, (pid_t) lwp,
+                                             comm, COMM_LEN + 1);
+
+      if (size > 0)
+        result = comm;
+
+    }
+
 #undef COMM_LEN
 #undef FORMAT

diff -ruN ./gdb.org/testsuite/ChangeLog ./gdb/testsuite/ChangeLog
--- ./gdb.org/testsuite/ChangeLog       2013-08-17 01:44:21.000000000 +0800
+++ ./gdb/testsuite/ChangeLog   2013-08-19 09:46:08.000000000 +0800
@@ -1,3 +1,9 @@
+2013-08-14  Will Huang  <will.huang@aliyun-inc.com>
+
+       PR threads/15824
+       * gdb.threads/manythreads.exp: Add test for get thread
+       original name.
+
 2013-08-16  Doug Evans  <dje@google.com>

        * lib/prelink-support.exp (prelink_yes): Flag test as unsupported if
diff -ruN ./gdb.org/testsuite/gdb.threads/manythreads.exp ./gdb/testsuite/gdb.threads/manythreads.exp
--- ./gdb.org/testsuite/gdb.threads/manythreads.exp     2013-01-01 14:41:27.000000000 +0800
+++ ./gdb/testsuite/gdb.threads/manythreads.exp 2013-08-19 09:47:10.000000000 +0800
@@ -93,6 +93,7 @@
     }
 }

+gdb_test "info threads" ".*manythreads.*" "check thread original name"
 gdb_test_no_output "thread name zardoz" "give a name to the thread"
 gdb_test "info threads" ".*zardoz.*" "check thread name"



Thanks,
Will.huang


> -----Original Message-----
> From: Yao Qi [mailto:yao@codesourcery.com]
> Sent: Friday, August 16, 2013 7:29 PM
> To: Will Huang
> Cc: gdb-patches@sourceware.org
> Subject: Re: [PATCH][PR threads/15824] when get threads name failed from info
> threads with linux kernel version earlier than 2.6.33
> 
> On 08/16/2013 06:22 PM, Will Huang wrote:
> >    Sorry for mistakes. There is no gdb_fopen_cloexec in gdb-7.6.  Except that
> all comments are accepted.
> >
> 
> Are you proposing a patch for GDB 7.6 tree only?  This problem exists on
> mainline too.  We post patch for mainline, and backport the patch to internal
> tree or older tree.
> 
> > +
> > +static int
> > +linux_proc_get_string (pid_t lwpid, pid_t tid, char *target,
> > +                       size_t t_size, const char *field) {
> > +  size_t field_len = strlen (field);
> > +  FILE *status_file;
> > +  char buf[100];
> > +  int retval = -1;
> > +
> > +  if (tid > 0)
> > +    xsnprintf (buf, sizeof (buf), "/proc/%d/task/%d/status",
> > +               (int) lwpid, (int) tid);  else  {
> > +     /*if TID is zero, ingnore it*/
> 
> /* If TID is zero, ignore it.  */
> 
> > +     xsnprintf (buf, sizeof (buf), "/proc/%d/status", (int) lwpid);
> > + }
> > +
> > +  status_file = fopen (buf, "r");
> > +  if (status_file == NULL)
> > +    {
> > +      warning (_("unable to open /proc file '%s'"), buf);
> > +      return -1;
> > +    }
> > +
> > +  while (fgets (buf, sizeof (buf), status_file))
> > +    if (strncmp (buf, field, field_len) == 0 && buf[field_len] == ':')
> > +      {
> > +       size_t pos = field_len + 1;
> 
> Blank line is needed here.
> 
> > diff -ruN ./gdb.org/linux-nat.c ./gdb/linux-nat.c
> > --- ./gdb.org/linux-nat.c       2013-02-13 22:59:49.000000000 +0800
> > +++ ./gdb/linux-nat.c   2013-08-16 17:55:19.000000000 +0800
> > @@ -4294,6 +4294,15 @@
> >
> >         fclose (comm_file);
> >       }
> > +  else
> > +    {
> > +      static char comm[COMM_LEN + 1];
> > +      int size = linux_proc_get_thread_name ((pid_t) pid, (pid_t)
> > + lwp, comm, COMM_LEN + 1);
> 
> This line is too long.
> 
> Otherwise, I don't have comments to this patch.
> 
> --
> Yao (齐尧)


  parent reply	other threads:[~2013-08-19  2:52 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-14  4:27 Will Huang
2013-08-16  2:26 ` Yao Qi
2013-08-16  5:32   ` Will Huang
2013-08-16  9:38     ` Yao Qi
2013-08-16 10:22       ` Will Huang
2013-08-16 11:29         ` Yao Qi
2013-08-16 16:24           ` Pedro Alves
2013-08-19  2:52           ` Will Huang [this message]
2013-08-19  3:10             ` Yao Qi
2013-08-19  5:01               ` Will Huang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000301ce9c87$19927630$4cb76290$@huang@aliyun-inc.com' \
    --to=will.huang@aliyun-inc.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    --cc=yao@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox