[RFA] gcore/linux-proc fix

Elena Zannoni ezannoni@redhat.com
Wed Sep 24 18:10:00 GMT 2003


This patch fixes some problems with the gcore command on single
threaded programs.  Before the patch, the core file did not report
anywhere the PID of the process:


  CORE                 144  PRSTATUS
    SIGINFO:  signo: 0, code = 0, errno = 0
    signal: 0, pending: 00000000, holding: 00000000
    pid: 0, ppid = 0, pgrp = 0, sid = 0
  ^^^^^^^^^


     utime:      0.000000s,  stime:      0.000000s
    cutime:      0.000000s, cstime:      0.000000s
    eax: fffffffc  ebx: bfffc4a4  ecx: bfffc4a4  edx: b75d79f8
    esi: bfffc5bc  edi: bfffc53c  ebp: bfffc648  esp: bfffc484
    eip: b75ebc02  eflags: 00000246, original eax: 000000a2
    cs: 0023  ds: 002b  es: 002b  fs: 0000  gs: 0033  ss: 002b




after the patch:


  CORE                 144  PRSTATUS
    SIGINFO:  signo: 0, code = 0, errno = 0
    signal: 0, pending: 00000000, holding: 00000000
    pid: 5846, ppid = 0, pgrp = 0, sid = 0
  ^^^^^^^^^^^^

     utime:      0.000000s,  stime:      0.000000s
    cutime:      0.000000s, cstime:      0.000000s
    eax: fffffffc  ebx: bffff674  ecx: bffff674  edx: b75d79f8
    esi: bffff78c  edi: bffff70c  ebp: bffff818  esp: bffff654
    eip: b75ebc02  eflags: 00000246, original eax: 000000a2
    cs: 0023  ds: 002b  es: 002b  fs: 0000  gs: 0033  ss: 002b

  CORE                 108  FPREGSET
  LINUX                512  <unknown>: 1189489535



Note also that if the function to write the note section is called via
the iterator for multi-threaded programs
(i.e. linux_corefile_thread_callback),
registers_changed()/target_fetch_registers() are called, but if
invoked directly for the single-threaded case,
registers_changed()/target_fetch_registers() are not called.
So I added a wrapper to do that.

It all works fine with multi-threaded apps.

elena


2003-09-24  Elena Zannoni  <ezannoni@redhat.com>

	* linux-proc.c (linux_do_registers): New function.
	(linux_make_note_section): Use linux_do_registers in case of
	single threaded inferior programs.


Index: linux-proc.c
===================================================================
RCS file: /cvs/src/src/gdb/linux-proc.c,v
retrieving revision 1.15
diff -u -p -r1.15 linux-proc.c
--- linux-proc.c	19 Jun 2003 22:52:03 -0000	1.15
+++ linux-proc.c	24 Sep 2003 16:33:07 -0000
@@ -233,6 +234,26 @@ linux_corefile_thread_callback (struct l
   return 0;
 }
 
+/* Function: linux_do_registers
+ * 
+ * Records the register state for the corefile note section.
+ */
+
+static char *
+linux_do_registers (bfd *obfd, ptid_t ptid,
+		    char *note_data, int *note_size)
+{
+  registers_changed ();
+  target_fetch_registers (-1);	/* FIXME should not be necessary; 
+				   fill_gregset should do it automatically. */
+  return linux_do_thread_registers (obfd,
+				    ptid_build (ptid_get_pid (inferior_ptid),
+						ptid_get_pid (inferior_ptid),
+						0),
+				    note_data, note_size);
+  return note_data;
+}
+
 /* Function: linux_make_note_section
  *
  * Fills the "to_make_corefile_note" target vector.
@@ -275,8 +296,8 @@ linux_make_note_section (bfd *obfd, int 
     {
       /* iterate_over_threads didn't come up with any threads;
          just use inferior_ptid.  */
-      note_data = linux_do_thread_registers (obfd, inferior_ptid,
-					     note_data, note_size);
+      note_data = linux_do_registers (obfd, inferior_ptid,
+				      note_data, note_size);
     }
   else
     {



More information about the Gdb-patches mailing list