commit 76583bee66b1faa3bfcf6de6f95e38dacc93d45a Author: Pedro Alves Date: Mon Dec 10 17:52:55 2012 +0000 Put a NT_PSTATUS note on solaris cores. This is based on the patch I once posted at: http://sourceware.org/ml/gdb-patches/2009-10/msg00188.html Rationale: This patch makes is so that cores generated with gdb's gcore on solaris also get an NT_PSTATUS note. It is from this note that gdb can extract the original pid of the process from the core. From higher up on procfs.c, we see that pstatus_t is assumed to be defined when NEW_PROC_API is defined, so this should be safe to not break builds on supported hosts. Older Solaris not using the the new proc api are unaffected. I had applied the patch back in 2009, and then shortly afterwards backed it out, because it broke Solaris builds. A patch to bfd this depended on was missing: http://sourceware.org/ml/gdb-patches/2009-10/msg00214.html The bfd patch went in 2010-01-04, but I never got back to pushing the GDB bit in. The user visible change is just that GDB will know the real PID the process that dumped core had (visible in "info inferiors"). 2012-12-11 Pedro Alves Pedro Alves gdb/ * procfs.c (procfs_make_note_section) [NEW_PROC_API]: Output a NT_PSTATUS note. * sol2-tdep.c (sol2_core_pid_to_str): Print process IDs differently from LWP IDs. v2: - restore elfcore_write_pstatus call. - make sol2_core_pid_to_str aware or process ids vs lwp ids. diff --git a/gdb/procfs.c b/gdb/procfs.c index fa18b46..1c5cc13 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -5507,6 +5507,13 @@ procfs_make_note_section (bfd *obfd, int *note_size) stop_signal = find_stop_signal (); +#ifdef NEW_PROC_API + fill_gregset (get_current_regcache (), &gregs, -1); + note_data = elfcore_write_pstatus (obfd, note_data, note_size, + PIDGET (inferior_ptid), + stop_signal, &gregs); +#endif + thread_args.obfd = obfd; thread_args.note_data = note_data; thread_args.note_size = note_size; diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c index e93758d..e292b8d 100644 --- a/gdb/sol2-tdep.c +++ b/gdb/sol2-tdep.c @@ -43,7 +43,29 @@ char * sol2_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid) { static char buf[80]; + struct inferior *inf; + int pid; - xsnprintf (buf, sizeof buf, "LWP %ld", ptid_get_lwp (ptid)); - return buf; + /* Check whether we're printing an LWP (gdb thread) or a + process. */ + pid = ptid_get_lwp (ptid); + if (pid != 0) + { + /* A thread. */ + xsnprintf (buf, sizeof buf, "LWP %ld", ptid_get_lwp (ptid)); + return buf; + } + + /* GDB didn't use to put a NT_PSTATUS note in Solaris cores. If + that's missing, then we're dealing with a fake PID corelow.c made + up. */ + inf = find_inferior_pid (ptid_get_pid (ptid)); + if (inf == NULL || inf->fake_pid_p) + { + xsnprintf (buf, sizeof buf, ""); + return buf; + } + + /* Not fake; print as usual. */ + return normal_pid_to_str (ptid); }