This is the mail archive of the gdb-prs@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]

[Bug tdep/17903] gdb cannot determine executable when attaching to processes on Solaris


https://sourceware.org/bugzilla/show_bug.cgi?id=17903

--- Comment #7 from phantall at gmail dot com ---
Comment on attachment 8851
  --> https://sourceware.org/bugzilla/attachment.cgi?id=8851
unix procfs to_pid_to_exec_file implementation

>diff --git a/gdb/procfs.c b/gdb/procfs.c
>index 7b7ff45..a663223 100644
>--- a/gdb/procfs.c
>+++ b/gdb/procfs.c
>@@ -51,6 +51,7 @@
> #include "auxv.h"
> #include "procfs.h"
> #include "observer.h"
>+#include "ansidecl.h"
>
>/* This module provides the interface between GDB and the
>   /proc file system, which is used on many versions of Unix
>@@ -118,6 +119,7 @@ static void procfs_fetch_registers (struct target_ops *,
>                                    struct regcache *, int);
> static void procfs_store_registers (struct target_ops *,
>                                    struct regcache *, int);
>+static char* procfs_child_pid_to_exec_file( struct target_ops*, int );
> static void procfs_pass_signals (struct target_ops *self,
>                                 int, unsigned char *);
> static void procfs_kill_inferior (struct target_ops *ops);
>@@ -192,6 +194,7 @@procfs_target (void)
>   t->to_resume = procfs_resume;
>   t->to_fetch_registers = procfs_fetch_registers;
>   t->to_store_registers = procfs_store_registers;
>+  t->to_pid_to_exec_file = procfs_child_pid_to_exec_file;
>   t->to_xfer_partial = procfs_xfer_partial;
>   t->to_pass_signals = procfs_pass_signals;
>   t->to_files_info = procfs_files_info;
>@@ -3301,6 +3304,41 @@ procfs_store_registers (struct target_ops *ops,
>     }
> }
>
>+/* "self" may not exist on some platforms,
>+ * otherwise that would be preferable to
>+ * a format string. */
>+static const char *proc_path_lookup[] = {
>+  "/proc/%u/path/a.out" // Most UNIXes with procfs (Solaris)
>+, "/proc/%u/file"       // BSD
>+, "/proc/%u/exe"        // Linux, Windows, NetBSD
>+, "/proc/%u/a.out"      // No idea, I've only seen references to it
>+};
>+
>+/* Get a fully qualified path to the debugged process */
>+static char* procfs_child_pid_to_exec_file( struct target_ops *ARG_UNUSED(self), int pid ) {
>+  static char buf[PATH_MAX] = {0};
>+  char name[PATH_MAX] = {0};
>+  ssize_t sz = -1;
>+  size_t ii = 0;
>+
>+  pid = pid >= 0 ? pid : -pid;
>+
>+  for( ii = 0; ii < sizeof(proc_path_lookup)/sizeof(proc_path_lookup[0]); ++ii ) {
>+    xsnprintf( name, sizeof(name), proc_path_lookup[ii], (unsigned int)pid );
>+    sz = readlink( name, buf, sizeof( name ) );
>+
>+    if( 0 < sz ) {
>+      buf[sz] = '\0';
>+      return buf;
>+    }
>+  }
>+
>+  /* This is the default behavior as defined in target.h
>+   * and implemented in inf_child_pid_to_exec_file() */
>+  return NULL;
>+}
>+

-- 
You are receiving this mail because:
You are on the CC list for the bug.

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