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

Re: [PATCH 1/2] Put a NT_PSTATUS note on solaris cores.


On 12/11/2012 03:03 AM, Joel Brobecker wrote:

> Tested on sparc-solaris, but it seems to have no effect yet:
> 
>     (gdb) core core.10498
>     [New LWP 1]
>     Core was generated by `/[...]/simple_main'.
>     Program terminated with signal 5, Trace/breakpoint trap.
>     #0  simple_main () at simple_main.adb:4
>     4           simple.test_simple;
>     (gdb) info inferiors
>       Num  Description       Executable
>     * 1    LWP 0             /[...]/simple_main
> 
> And after the patch:
> 
>     (gdb) core core.15731
>     [New LWP 1]
>     Core was generated by `/[...]/simple_main'.
>     Program terminated with signal 5, Trace/breakpoint trap.
>     #0  simple_main () at simple_main.adb:4
>     4           simple.test_simple;
>     (gdb) info inferiors
>       Num  Description       Executable
>     * 1    LWP 0             /[...]/simple_main
> 
> I can see that the second core file is bigger, but I am lacking
> the time to investigate this further at the moment. Maybe I am
> doing the wrong test?

You're doing the right test.  The issue is that core_pid_to_str
calls into the gdbarch_core_pid_to_str, and that isn't expecting
to be passed a "process pid" instead of an "LWP pid".

Could you try this one when you have a chance?  This is rebased on
top of current mainline, so it restores the elfcore_write_pstatus
call that the Unixware-excise patch removed.  I made sure it builds with
--enable-targets=all.

Thanks!

-- 
Pedro Alves

commit 76583bee66b1faa3bfcf6de6f95e38dacc93d45a
Author: Pedro Alves <palves@redhat.com>
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@codesourcery.com>
    	    Pedro Alves  <palves@redhat.com>
    
    	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, "<core>");
+      return buf;
+    }
+
+  /* Not fake; print as usual.  */
+  return normal_pid_to_str (ptid);
 }

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