This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [BFD PATCH] Fix QNX Neutrino core file reading
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: Kris Warkentin <kewarken at qnx dot com>
- Cc: "Gdb-Patches at Sources dot Redhat dot Com" <gdb-patches at sources dot redhat dot com>
- Date: Thu, 15 May 2003 15:59:32 -0400
- Subject: Re: [BFD PATCH] Fix QNX Neutrino core file reading
- References: <045401c31b18$7ebac400$0202040a@catdog>
On Thu, May 15, 2003 at 03:30:51PM -0400, Kris Warkentin wrote:
> I finally figured out why our core files weren't showing which thread was
> active when it was generated. It seems we weren't setting lwpid correctly
> and were not making the .reg section at the correct time. Okay to apply?
Wrong list - ask on binutils@. Looks reasonable though.
>
> cheers,
>
> Kris
>
> Changelog:
>
> * elf.c (elfcore_grok_nto_status): Only set lwpid for the active or
> signalled thread.
> (elfcore_grok_nto_gregs): Only make .reg section for the active thread.
>
> Index: elf.c
> ===================================================================
> RCS file: /cvs/src/src/bfd/elf.c,v
> retrieving revision 1.184
> diff -u -r1.184 elf.c
> --- elf.c 9 May 2003 10:58:12 -0000 1.184
> +++ elf.c 15 May 2003 19:27:31 -0000
> @@ -7001,18 +7001,30 @@
> char buf[100];
> char *name;
> asection *sect;
> + short sig;
> + unsigned flags;
>
> /* nto_procfs_status 'pid' field is at offset 0. */
> elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
>
> - /* nto_procfs_status 'tid' field is at offset 4. */
> - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
> + /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
> + *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
>
> - /* nto_procfs_status 'what' field is at offset 14. */
> - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, (bfd_byte *) ddata +
> 14);
> + /* nto_procfs_status 'flags' field is at offset 8. */
> + flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
>
> - /* Pass tid back. */
> - *tid = elf_tdata (abfd)->core_lwpid;
> + /* nto_procfs_status 'what' field is at offset 14. */
> + if( (sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0 ){
> + elf_tdata (abfd)->core_signal = sig;
> + elf_tdata (abfd)->core_lwpid = *tid;
> + }
> +
> + /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
> + do not come from signals so we make sure we set the current
> + thread just in case. */
> + if (flags & 0x00000080){
> + elf_tdata (abfd)->core_lwpid = *tid;
> + }
>
> /* Make a ".qnx_core_status/%d" section. */
> sprintf (buf, ".qnx_core_status/%d", *tid);
> @@ -7022,8 +7034,7 @@
> return FALSE;
> strcpy (name, buf);
>
> - sect = bfd_make_section (abfd, name);
> - if (sect == NULL)
> + if ( (sect = bfd_make_section (abfd, name)) == NULL )
> return FALSE;
>
> sect->_raw_size = note->descsz;
> @@ -7061,7 +7072,12 @@
> sect->flags = SEC_HAS_CONTENTS;
> sect->alignment_power = 2;
>
> - return elfcore_maybe_make_sect (abfd, ".reg", sect);
> + /* This is the current thread. */
> + if (elf_tdata (abfd)->core_lwpid == tid){
> + return elfcore_maybe_make_sect (abfd, ".reg", sect);
> + }
> +
> + return TRUE;
> }
>
> #define BFD_QNT_CORE_INFO 7
>
>
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer