libdwfl: linux-pid-attach.c: Report actual PID (Tgid) to dwfl_attach_state.
authorMark Wielaard <mjw@redhat.com>
Mon, 23 Dec 2013 13:20:06 +0000 (14:20 +0100)
committerMark Wielaard <mjw@redhat.com>
Wed, 25 Dec 2013 21:24:56 +0000 (22:24 +0100)
Signed-off-by: Mark Wielaard <mjw@redhat.com>
libdwfl/ChangeLog
libdwfl/linux-pid-attach.c

index 13a4ff9..8e50f2f 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-pid-attach.c (__libdwfl_attach_state_for_pid): Report actual
+       pid (thread group leader) to dwfl_attach_state.
+
 2013-12-21  Mark Wielaard  <mjw@redhat.com>
 
        * frame_unwind.c (handle_cfi): Track whether the return register
index 2e1d359..70bd666 100644 (file)
@@ -285,6 +285,30 @@ bool
 internal_function
 __libdwfl_attach_state_for_pid (Dwfl *dwfl, pid_t pid)
 {
+  char buffer[36];
+  FILE *procfile;
+
+  /* Make sure to report the actual PID (thread group leader) to
+     dwfl_attach_state.  */
+  snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid);
+  procfile = fopen (buffer, "r");
+  if (procfile == NULL)
+    return false;
+
+  char *line = NULL;
+  size_t linelen = 0;
+  while (getline (&line, &linelen, procfile) >= 0)
+    if (strncmp (line, "Tgid:", 5) == 0)
+      {
+        pid = atoi (&line[5]);
+        break;
+      }
+  free (line);
+  fclose (procfile);
+
+  if (pid == 0)
+    return false;
+
   char dirname[64];
   int i = snprintf (dirname, sizeof (dirname), "/proc/%ld/task", (long) pid);
   assert (i > 0 && i < (ssize_t) sizeof (dirname) - 1);