This is the mail archive of the
gdb-prs@sourceware.org
mailing list for the GDB project.
[Bug tdep/17903] gdb cannot determine executable when attaching to processes on Solaris
- From: "phantall at gmail dot com" <sourceware-bugzilla at sourceware dot org>
- To: gdb-prs at sourceware dot org
- Date: Wed, 16 Dec 2015 20:43:52 +0000
- Subject: [Bug tdep/17903] gdb cannot determine executable when attaching to processes on Solaris
- Auto-submitted: auto-generated
- References: <bug-17903-4717 at http dot sourceware dot org/bugzilla/>
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.