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

Pedro Alves
2012-12-11T12:22:33Z

[-- Attachment #1: Type: text/plain, Size: 1464 bytes --]

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

[-- Attachment #2: nt_pstatus.diff --]
[-- Type: text/x-patch, Size: 3232 bytes --]

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);
}