public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
* Fwd: [PATCH 1/1] x86: Add process memory layout to coredump file
       [not found] <CAE04G=Bu4WnU9SYU9u3-ap6OrBEjWONK8TA8bYBy5OSCCzzDqg@mail.gmail.com>
@ 2011-12-11 14:10 ` t cheney
  2011-12-12 21:03   ` Jan Kratochvil
       [not found] ` <m2y5uknqjk.fsf@firstfloor.org>
  1 sibling, 1 reply; 5+ messages in thread
From: t cheney @ 2011-12-11 14:10 UTC (permalink / raw)
  To: gdb

---------- Forwarded message ----------
From: t cheney <cdmalord@gmail.com>
Date: Sat, 10 Dec 2011 22:37:02 +0800
Subject: [PATCH 1/1] x86: Add process memory layout to coredump file
To: linux-kernel@vger.kernel.org
Cc: viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org

This patch just add memory layout(same as /proc/pid/maps) to
coredump file. The layout is appended to corenote segment with
flag NT_MAPS=7.

Signed-off-by: cheney <cdmalord@gmail.com>
---
 fs/binfmt_elf.c     |  210 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 include/linux/elf.h |    1 +
 2 files changed, 208 insertions(+), 3 deletions(-)

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 21ac5ee..d9d07f4 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -35,6 +35,7 @@
 #include <asm/uaccess.h>
 #include <asm/param.h>
 #include <asm/page.h>
+#include <linux/seq_file.h>

 static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs);
 static int load_elf_library(struct file *);
@@ -1200,6 +1201,12 @@ static int notesize(struct memelfnote *en)
 #define DUMP_WRITE(addr, nr, foffset)	\
 	do { if (!dump_write(file, (addr), (nr))) return 0; *foffset +=
(nr); } while(0)

+static struct vm_area_struct *first_vma(struct task_struct *tsk,
+	struct vm_area_struct *gate_vma);
+static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
+	struct vm_area_struct *gate_vma);
+/*extern char *mangle_path(char *s, char *p, char *esc);
+*/
 static int alignfile(struct file *file, loff_t *foffset)
 {
 	static const char buf[4] = { 0, };
@@ -1207,6 +1214,156 @@ static int alignfile(struct file *file, loff_t *foffset)
 	return 1;
 }

+static int pad_spaces(char *p, int len)
+{
+	int i;
+	len = 25 + sizeof(void *) * 6 - len;
+	if (len < 1)
+		len = 1;
+	i = len;
+	while (i--)
+		*p++ = ' ';
+	return len;
+}
+
+const char *get_vma_name(struct vm_area_struct *vma)
+{
+	const char *name = arch_vma_name(vma);
+	if (!name) {
+		struct mm_struct *mm = vma->vm_mm;
+		if (mm) {
+			if (vma->vm_start <= mm->brk &&
+				vma->vm_end >= mm->start_brk) {
+				name = "[heap]";
+			} else if (vma->vm_start <= mm->start_stack &&
+				vma->vm_end >= mm->start_stack) {
+				name = "[stack]";
+			}
+		} else {
+			name = "[vdso]";
+		}
+	}
+	return name;
+}
+
+/*  handle memory map in core
+ *  if filp=0 it just calculate the size of maps.
+ */
+static int core_handle_maps(struct file *file, struct memelfnote *notes,
+		loff_t *foffset)
+{
+	size_t maps_size = 0;
+	size_t len;
+	size_t space;
+	struct vm_area_struct *vma, *gate_vma;
+	int flags;
+	struct inode *inode;
+	unsigned long ino;
+	unsigned long long pgoff;
+	unsigned long start, end;
+	dev_t dev;
+	char *esc = "\n";
+	char *p;
+	char *s;
+	char *buf = notes->data;
+	size_t core_limit = notes->datasz;
+	gate_vma = get_gate_vma(current->mm);
+
+	for (vma = first_vma(current, gate_vma); vma != NULL;
+		vma = next_vma(vma, gate_vma)) {
+		flags = vma->vm_flags;
+		ino = 0;
+		dev = 0;
+		space = 0;
+		inode = NULL;
+		pgoff = 0;
+		len = 0;
+		if (vma->vm_file) {
+			inode = vma->vm_file->f_dentry->d_inode;
+			dev = inode->i_sb->s_dev;
+			ino = inode->i_ino;
+			pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
+		}
+		start = vma->vm_start;
+		if (stack_guard_page_start(vma, start))
+			start += PAGE_SIZE;
+		end = vma->vm_end;
+		if (stack_guard_page_end(vma, end))
+			end -= PAGE_SIZE;
+		len = sprintf(buf, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu",
+			start,
+			end,
+			flags & VM_READ ? 'r' : '-',
+			flags & VM_WRITE ? 'w' : '-',
+			flags & VM_EXEC ? 'x' : '-',
+			flags & VM_MAYSHARE ? 's' : 'p',
+			pgoff,
+			MAJOR(dev), MINOR(dev), ino);
+		maps_size += len;
+		if (file) {
+			if (maps_size > core_limit)
+				break;
+			DUMP_WRITE(buf, len, foffset);
+		}
+		if (vma->vm_file) {
+			space = pad_spaces(buf, len);
+			s = buf + space;
+			p = d_path(&vma->vm_file->f_path, s, maps_size-1);
+			if (!IS_ERR(p)) {
+				char *last;
+				last = mangle_path(s, p, esc);
+				len = last - buf;
+				maps_size += len;
+				if (file) {
+					if (maps_size > core_limit)
+						 break;
+					DUMP_WRITE(buf, len, foffset);
+				}
+			}
+		} else {
+			const char *name = get_vma_name(vma);
+			if (name) {
+				space = pad_spaces(buf, len);
+				maps_size += space;
+				maps_size += strlen(name);
+				if (file) {
+					if (maps_size > core_limit)
+						 break;
+					DUMP_WRITE(buf, space, foffset);
+					DUMP_WRITE(name, strlen(name), foffset);
+				}
+			}
+		}
+		maps_size++;
+		if (file) {
+			if (maps_size > core_limit)
+				break;
+			DUMP_WRITE("\n", 1, foffset);
+		}
+	}
+	return maps_size;
+}
+
+static int writemaps(struct file *file, struct memelfnote *men,
+	loff_t *foffset)
+{
+	struct elf_note en;
+	en.n_namesz = strlen(men->name) + 1;
+	en.n_descsz = men->datasz;
+	en.n_type = men->type;
+
+	DUMP_WRITE(&en, sizeof(en), foffset);
+	DUMP_WRITE(men->name, en.n_namesz, foffset);
+	if (!alignfile(file, foffset))
+		return 0;
+	if (!core_handle_maps(file, men, foffset))
+		return 0;
+	if (!alignfile(file, foffset))
+		return 0;
+
+	return 1;
+}
+
 static int writenote(struct memelfnote *men, struct file *file,
 			loff_t *foffset)
 {
@@ -1374,6 +1531,8 @@ struct elf_note_info {
 	struct elf_thread_core_info *thread;
 	struct memelfnote psinfo;
 	struct memelfnote auxv;
+	/* maps is for memory layout */
+	struct memelfnote maps;
 	size_t size;
 	int thread_notes;
 };
@@ -1460,6 +1619,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
 	struct elf_prpsinfo *psinfo;
 	struct core_thread *ct;
 	unsigned int i;
+	int maps_size;

 	info->size = 0;
 	info->thread = NULL;
@@ -1468,6 +1628,21 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
 	if (psinfo == NULL)
 		return 0;

+	info->maps.data = kmalloc(PAGE_SIZE, GFP_KERNEL);
+	if (info->maps.data == NULL) {
+		kfree(psinfo);
+		return 0;
+	}
+	/* Just calculate maps' size  */
+	maps_size = core_handle_maps(NULL, &info->maps, NULL);
+	if (!maps_size) {
+		kfree(psinfo);
+		kfree(info->maps.data);
+		return 0;
+	}
+	fill_note(&info->maps, "CORE", NT_MAPS, maps_size, info->maps.data);
+	info->size += notesize(&info->maps);
+
 	fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);

 	/*
@@ -1572,6 +1747,10 @@ static int write_note_info(struct elf_note_info *info,
 		t = t->next;
 	} while (t);

+	/* Write maps */
+	if (!writemaps(file, &info->maps, foffset))
+		return 0;
+
 	return 1;
 }

@@ -1588,6 +1767,7 @@ static void free_note_info(struct elf_note_info *info)
 		kfree(t);
 	}
 	kfree(info->psinfo.data);
+	kfree(info->maps.data);
 }

 #else
@@ -1648,6 +1828,7 @@ struct elf_note_info {
 	struct memelfnote *notes;
 	struct elf_prstatus *prstatus;	/* NT_PRSTATUS */
 	struct elf_prpsinfo *psinfo;	/* NT_PRPSINFO */
+	char *maps;                     /* NT_MAPS */
 	struct list_head thread_list;
 	elf_fpregset_t *fpu;
 #ifdef ELF_CORE_COPY_XFPREGS
@@ -1663,12 +1844,16 @@ static int elf_note_info_init(struct
elf_note_info *info)
 	INIT_LIST_HEAD(&info->thread_list);

 	/* Allocate space for six ELF notes */
-	info->notes = kmalloc(6 * sizeof(struct memelfnote), GFP_KERNEL);
+	/* Add maps into notes */
+	info->notes = kmalloc((6+1) * sizeof(struct memelfnote), GFP_KERNEL);
 	if (!info->notes)
 		return 0;
+	info->maps = kmalloc(PAGE_SIZE, GFP_KERNEL);
+	if (!info->maps)
+		goto notes_free;
 	info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
 	if (!info->psinfo)
-		goto notes_free;
+		goto maps_free;
 	info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
 	if (!info->prstatus)
 		goto psinfo_free;
@@ -1689,6 +1874,8 @@ static int elf_note_info_init(struct elf_note_info *info)
 	kfree(info->prstatus);
  psinfo_free:
 	kfree(info->psinfo);
+ maps_free:
+	kfree(info->maps);
  notes_free:
 	kfree(info->notes);
 	return 0;
@@ -1699,6 +1886,7 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
 			  long signr, struct pt_regs *regs)
 {
 	struct list_head *t;
+	int maps_size;

 	if (!elf_note_info_init(info))
 		return 0;
@@ -1761,6 +1949,14 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
 			  sizeof(*info->xfpu), info->xfpu);
 #endif

+	info->notes[info->numnote].data = info->maps;
+	/* Just calculate maps's size */
+	maps_size = core_handle_maps(NULL, info->notes + info->numnote, NULL);
+	if (!maps_size)
+		return 0;
+	fill_note(info->notes + info->numnote++, "CORE", NT_MAPS,
+		maps_size, info->maps);
+
 	return 1;
 }

@@ -1783,9 +1979,16 @@ static int write_note_info(struct elf_note_info *info,
 	int i;
 	struct list_head *t;

-	for (i = 0; i < info->numnote; i++)
+	for (i = 0; i < info->numnote; i++) {
+		/* Write maps */
+		if (info->notes[i].type == NT_MAPS) {
+			if (!writemaps(file, info->notes + i, foffset))
+				return 0;
+			continue;
+		}
 		if (!writenote(info->notes + i, file, foffset))
 			return 0;
+	}

 	/* write out the thread status notes section */
 	list_for_each(t, &info->thread_list) {
@@ -1812,6 +2015,7 @@ static void free_note_info(struct elf_note_info *info)
 	kfree(info->psinfo);
 	kfree(info->notes);
 	kfree(info->fpu);
+	kfree(info->maps);
 #ifdef ELF_CORE_COPY_XFPREGS
 	kfree(info->xfpu);
 #endif
diff --git a/include/linux/elf.h b/include/linux/elf.h
index 31f0508..b9d710b 100644
--- a/include/linux/elf.h
+++ b/include/linux/elf.h
@@ -381,6 +381,7 @@ typedef struct elf64_shdr {
 #define NT_PRPSINFO	3
 #define NT_TASKSTRUCT	4
 #define NT_AUXV		6
+#define NT_MAPS         7
 #define NT_PRXFPREG     0x46e62b7f      /* copied from
gdb5.1/include/elf/common.h */
 #define NT_PPC_VMX	0x100		/* PowerPC Altivec/VMX registers */
 #define NT_PPC_SPE	0x101		/* PowerPC SPE/EVR registers */
-- 
1.5.3.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Fwd: [PATCH 1/1] x86: Add process memory layout to coredump file
       [not found]     ` <CAE04G=A7WWG4WDoTfcBVMsxNB2xndVTq4s6DPdsyDEca4Up=SQ@mail.gmail.com>
@ 2011-12-11 14:15       ` t cheney
  2011-12-12 21:09         ` Jan Kratochvil
  0 siblings, 1 reply; 5+ messages in thread
From: t cheney @ 2011-12-11 14:15 UTC (permalink / raw)
  To: gdb

---------- Forwarded message ----------
From: t cheney <cdmalord@gmail.com>
Date: Sun, 11 Dec 2011 21:19:22 +0800
Subject: Re: [PATCH 1/1] x86: Add process memory layout to coredump file
To: Andi Kleen <andi@firstfloor.org>
Cc: linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk,
linux-fsdevel@vger.kernel.org

This is readelf's patch which can retrieve maps in coredump
file, and it is based on binutils-2.21.1.
Usage: ./readelf -m coredumpfile
https://github.com/cdma/coredumpmap/blob/dev/readelf.c
https://github.com/cdma/coredumpmap/blob/dev/common.h

Alternately, following is diff's result:
changed files:
./binutils-2.21.1/binutils/readelf.c
./binutils-2.21.1/include/elf/common.h

diff -u ./binutils-2.21.1/binutils/readelf.c
./binutils-2.21.1/binutils/readelf.c.orig
--- ./binutils-2.21.1/binutils/readelf.c        2011-12-07
14:54:45.000000000 -0500
+++ ./binutils-2.21.1/binutils/readelf.c.orig   2011-12-07
14:53:43.000000000 -0500
@@ -196,7 +196,6 @@
 static int do_notes;
 static int do_archive_index;
 static int is_32bit_elf;
-static int do_maps;

 struct group_list
 {
@@ -3072,7 +3071,6 @@
  {"dyn-syms",        no_argument, 0, OPTION_DYN_SYMS},
  {"relocs",          no_argument, 0, 'r'},
  {"notes",           no_argument, 0, 'n'},
-  {"maps",            no_argument, 0, 'm'},
  {"dynamic",         no_argument, 0, 'd'},
  {"arch-specific",    no_argument, 0, 'A'},
  {"version-info",     no_argument, 0, 'V'},
@@ -3112,7 +3110,6 @@
     --symbols           An alias for --syms\n\
  --dyn-syms             Display the dynamic symbol table\n\
  -n --notes             Display the core notes (if present)\n\
-  -m --maps              Display the core maps (if present)\n\
  -r --relocs            Display the relocations (if present)\n\
  -u --unwind            Display the unwind info (if present)\n\
  -d --dynamic           Display the dynamic section (if present)\n\
@@ -3231,7 +3228,7 @@
    usage (stderr);

  while ((c = getopt_long
-         (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:m", options,
NULL)) != EOF)
+         (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options,
NULL)) != EOF)
    {
      switch (c)
       {
@@ -3354,9 +3351,6 @@
       case 'W':
         do_wide++;
         break;
-       case 'm':
-         do_maps++;
-         break;
       default:
         /* xgettext:c-format */
         error (_("Invalid option '-%c'\n"), c);
@@ -3370,7 +3364,7 @@
      && !do_segments && !do_header && !do_dump && !do_version
      && !do_histogram && !do_debugging && !do_arch && !do_notes
      && !do_section_groups && !do_archive_index
-      && !do_dyn_syms && !do_maps)
+      && !do_dyn_syms)
    usage (stderr);
  else if (argc < 3)
    {
@@ -11855,8 +11849,6 @@
       return _("NT_LWPSINFO (lwpsinfo_t structure)");
      case NT_WIN32PSTATUS:
       return _("NT_WIN32PSTATUS (win32_pstatus structure)");
-      case NT_MAPS:
-       return _("NT_MAPS (maps info)");
      default:
       break;
      }
@@ -11970,9 +11962,6 @@
 {
  const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
  const char * nt;
-
-  if (do_maps && pnote->type != NT_MAPS)
-       return 0;

  if (pnote->namesz == 0)
    /* If there is no note name, then use the default set of
@@ -12000,13 +11989,6 @@
      nt = get_note_type (pnote->type);

  printf ("  %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
-  if (do_maps && pnote->type == NT_MAPS)
-  {
-      pnote->descdata[pnote->descsz] = 0;
-      printf("Maps is following:\n");
-      printf("%s\n",pnote->descdata);
-  }
-
  return 1;
 }

@@ -12093,6 +12075,7 @@
       }

      res &= process_note (& inote);
+
      if (temp != NULL)
       {
         free (temp);
@@ -12150,7 +12133,7 @@
 process_notes (FILE * file)
 {
  /* If we have not been asked to display the notes then do nothing.  */
-  if (! do_notes && !do_maps)
+  if (! do_notes)
    return 1;

  if (elf_header.e_type != ET_CORE)


diff -u ./binutils-2.21.1/include/elf/common.h
./binutils-2.21.1/include/elf/common.h.orig
--- ./binutils-2.21.1/include/elf/common.h      2011-12-07
14:56:02.000000000 -0500
+++ ./binutils-2.21.1/include/elf/common.h.orig 2011-12-07
14:55:45.000000000 -0500
@@ -518,7 +518,6 @@
 #define NT_PRPSINFO    3               /* Contains copy of prpsinfo struct */
 #define NT_TASKSTRUCT  4             /* Contains copy of task struct */
 #define NT_AUXV                6            /* Contains copy of Elfxx_auxv_t */
-#define NT_MAPS         7               /* Contains copy of maps*/
 #define NT_PRXFPREG    0x46e62b7f      /* Contains a user_xfpregs_struct; */
                                       /*   note name must be "LINUX".  */
 #define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */



On 12/11/11, t cheney <cdmalord@gmail.com> wrote:
> On 12/11/11, Andi Kleen <andi@firstfloor.org> wrote:
>> t cheney <cdmalord@gmail.com> writes:
>>
>>> This patch just add memory layout(same as /proc/pid/maps) to
>>> coredump file. The layout is appended to corenote segment with
>>> flag NT_MAPS=7.
>>
>> Seems like a reasonable idea, but can you please share code with
>> the proc implementation?
> Yes, I will post it in following mail.
>>
>> It's a bit unusal to have ASCII in a coredump, but I suppose expressing
>> this in binary would be somewhat ugly.
>>
>>> +	char *buf = notes->data;
>>> +	size_t core_limit = notes->datasz;
>>> +	gate_vma = get_gate_vma(current->mm);
>>> +
> The maps info is appended to core notes segment in which there are all
> ASCII text such as regs,signal and thread info.
>>
>> It seems a bit dubious to do this without locking even in a core dump.
>>
>>> +	for (vma = first_vma(current, gate_vma); vma != NULL;
>>> +		vma = next_vma(vma, gate_vma)) {
>>> +		flags = vma->vm_flags;
>>> +		maps_size += len;
>>> +		if (file) {
>>> +			if (maps_size > core_limit)
>>> +				break;
>>
>> You have a one-off bug here. Also below.
>>
>>> +			DUMP_WRITE(buf, len, foffset);
>>> +		}
>>
> Because proceses that could change vma pages are blocked in do_exit,
> here vma pages are safe.
>>
>> -Andi
>> --
>> ak@linux.intel.com -- Speaking for myself only
>>
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] x86: Add process memory layout to coredump file
  2011-12-11 14:10 ` Fwd: [PATCH 1/1] x86: Add process memory layout to coredump file t cheney
@ 2011-12-12 21:03   ` Jan Kratochvil
  2011-12-18 10:11     ` t cheney
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kratochvil @ 2011-12-12 21:03 UTC (permalink / raw)
  To: t cheney; +Cc: gdb, linux-kernel, viro, linux-fsdevel, crash-catcher

On Sun, 11 Dec 2011 15:10:00 +0100, t cheney wrote:
> This patch just add memory layout(same as /proc/pid/maps) to
> coredump file. The layout is appended to corenote segment with
> flag NT_MAPS=7.

FYI this has been solved by ABRT - Automated Bug-Reporting Tool
	https://fedorahosted.org/abrt/
	(it is distro-neutral despite its homepage)

Core file is there a subdirectory where the core file is just one of the many
associated files:
/var/spool/abrt/ccpp-*:
	abrt_version analyzer architecture cmdline component coredump count
	dso_list environ executable hostname kernel maps os_release package
	pid pwd reason time uid username uuid var_log_messages

More info files are being continually added, such as /proc/PID/fd{,info}/
mapping at the crash dump time etc.  You would need to add many more core file
notes to make the core files useful for later analysis.


Regards,
Jan

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fwd: [PATCH 1/1] x86: Add process memory layout to coredump file
  2011-12-11 14:15       ` Fwd: " t cheney
@ 2011-12-12 21:09         ` Jan Kratochvil
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Kratochvil @ 2011-12-12 21:09 UTC (permalink / raw)
  To: t cheney; +Cc: gdb

On Sun, 11 Dec 2011 15:15:16 +0100, t cheney wrote:
> This is readelf's patch which can retrieve maps in coredump
> file, and it is based on binutils-2.21.1.

This patch should therefore has been sent to <binutils@sourceware.org>
(and not to <gdb@sourceware.org>).

FYI <gdb-patches@sourceware.org> has ongoing discussion about accesing this
mapping information by GDB:
	http://sourceware.org/ml/gdb-patches/2011-12/msg00018.html
	(the whole thread plus previous months)

Before posting to <binutils@sourceware.org> please verify it applies to
binutils HEAD.  Plus I could not apply your patch as it was line-wrapped.


Regards,
Jan

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] x86: Add process memory layout to coredump file
  2011-12-12 21:03   ` Jan Kratochvil
@ 2011-12-18 10:11     ` t cheney
  0 siblings, 0 replies; 5+ messages in thread
From: t cheney @ 2011-12-18 10:11 UTC (permalink / raw)
  To: Jan Kratochvil
  Cc: gdb, linux-kernel, viro, linux-fsdevel, gdb-patches, binutils

Thank your suggestion.

changed files:
./binutils-2.21.1/binutils/readelf.c
./binutils-2.21.1/include/elf/common.h

diff -u ./binutils-2.21.1/binutils/readelf.c
./binutils-2.21.1/binutils/readelf.c.orig
--- ./binutils-2.21.1/binutils/readelf.c        2011-12-07
14:54:45.000000000 -0500
+++ ./binutils-2.21.1/binutils/readelf.c.orig   2011-12-07
14:53:43.000000000 -0500
@@ -196,7 +196,6 @@
 static int do_notes;
 static int do_archive_index;
 static int is_32bit_elf;
-static int do_maps;

 struct group_list
 {
@@ -3072,7 +3071,6 @@
   {"dyn-syms",        no_argument, 0, OPTION_DYN_SYMS},
   {"relocs",          no_argument, 0, 'r'},
   {"notes",           no_argument, 0, 'n'},
-  {"maps",            no_argument, 0, 'm'},
   {"dynamic",         no_argument, 0, 'd'},
   {"arch-specific",    no_argument, 0, 'A'},
   {"version-info",     no_argument, 0, 'V'},
@@ -3112,7 +3110,6 @@
      --symbols           An alias for --syms\n\
   --dyn-syms             Display the dynamic symbol table\n\
   -n --notes             Display the core notes (if present)\n\
-  -m --maps              Display the core maps (if present)\n\
   -r --relocs            Display the relocations (if present)\n\
   -u --unwind            Display the unwind info (if present)\n\
   -d --dynamic           Display the dynamic section (if present)\n\
@@ -3231,7 +3228,7 @@
     usage (stderr);

   while ((c = getopt_long
-         (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:m", options,
NULL)) != EOF)
+         (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options,
NULL)) != EOF)
     {
       switch (c)
        {
@@ -3354,9 +3351,6 @@
        case 'W':
          do_wide++;
          break;
-       case 'm':
-         do_maps++;
-         break;
        default:
          /* xgettext:c-format */
          error (_("Invalid option '-%c'\n"), c);
@@ -3370,7 +3364,7 @@
       && !do_segments && !do_header && !do_dump && !do_version
       && !do_histogram && !do_debugging && !do_arch && !do_notes
       && !do_section_groups && !do_archive_index
-      && !do_dyn_syms && !do_maps)
+      && !do_dyn_syms)
     usage (stderr);
   else if (argc < 3)
     {
@@ -11855,8 +11849,6 @@
        return _("NT_LWPSINFO (lwpsinfo_t structure)");
       case NT_WIN32PSTATUS:
        return _("NT_WIN32PSTATUS (win32_pstatus structure)");
-      case NT_MAPS:
-       return _("NT_MAPS (maps info)");
       default:
        break;
       }
@@ -11970,9 +11962,6 @@
 {
   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
   const char * nt;
-
-  if (do_maps && pnote->type != NT_MAPS)
-       return 0;

   if (pnote->namesz == 0)
     /* If there is no note name, then use the default set of
@@ -12000,13 +11989,6 @@
       nt = get_note_type (pnote->type);

   printf ("  %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
-  if (do_maps && pnote->type == NT_MAPS)
-  {
-      pnote->descdata[pnote->descsz] = 0;
-      printf("Maps is following:\n");
-      printf("%s\n",pnote->descdata);
-  }
-
   return 1;
 }

@@ -12093,6 +12075,7 @@
        }

       res &= process_note (& inote);
+
       if (temp != NULL)
        {
          free (temp);
@@ -12150,7 +12133,7 @@
 process_notes (FILE * file)
 {
   /* If we have not been asked to display the notes then do nothing.  */
-  if (! do_notes && !do_maps)
+  if (! do_notes)
     return 1;

   if (elf_header.e_type != ET_CORE)

diff -u ./binutils-2.21.1/include/elf/common.h
./binutils-2.21.1/include/elf/common.h.orig
--- ./binutils-2.21.1/include/elf/common.h      2011-12-07
14:56:02.000000000 -0500
+++ ./binutils-2.21.1/include/elf/common.h.orig 2011-12-07
14:55:45.000000000 -0500
@@ -518,7 +518,6 @@
 #define NT_PRPSINFO    3               /* Contains copy of prpsinfo struct */
 #define NT_TASKSTRUCT  4               /* Contains copy of task struct */
 #define NT_AUXV                6               /* Contains copy of
Elfxx_auxv_t */
-#define NT_MAPS         7               /* Contains copy of maps*/
 #define NT_PRXFPREG    0x46e62b7f      /* Contains a user_xfpregs_struct; */
                                        /*   note name must be "LINUX".  */
 #define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */


On 12/13/11, Jan Kratochvil <jan.kratochvil@redhat.com> wrote:
> On Sun, 11 Dec 2011 15:10:00 +0100, t cheney wrote:
>> This patch just add memory layout(same as /proc/pid/maps) to
>> coredump file. The layout is appended to corenote segment with
>> flag NT_MAPS=7.
>
> FYI this has been solved by ABRT - Automated Bug-Reporting Tool
> 	https://fedorahosted.org/abrt/
> 	(it is distro-neutral despite its homepage)
>
> Core file is there a subdirectory where the core file is just one of the
> many
> associated files:
> /var/spool/abrt/ccpp-*:
> 	abrt_version analyzer architecture cmdline component coredump count
> 	dso_list environ executable hostname kernel maps os_release package
> 	pid pwd reason time uid username uuid var_log_messages
>
> More info files are being continually added, such as /proc/PID/fd{,info}/
> mapping at the crash dump time etc.  You would need to add many more core
> file
> notes to make the core files useful for later analysis.
>
>
> Regards,
> Jan
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-12-18 10:11 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CAE04G=Bu4WnU9SYU9u3-ap6OrBEjWONK8TA8bYBy5OSCCzzDqg@mail.gmail.com>
2011-12-11 14:10 ` Fwd: [PATCH 1/1] x86: Add process memory layout to coredump file t cheney
2011-12-12 21:03   ` Jan Kratochvil
2011-12-18 10:11     ` t cheney
     [not found] ` <m2y5uknqjk.fsf@firstfloor.org>
     [not found]   ` <CAE04G=Bq+tyPnM+SVHUm+AQH4nLOy-KH7foRVNFs6GNdzpiX_Q@mail.gmail.com>
     [not found]     ` <CAE04G=A7WWG4WDoTfcBVMsxNB2xndVTq4s6DPdsyDEca4Up=SQ@mail.gmail.com>
2011-12-11 14:15       ` Fwd: " t cheney
2011-12-12 21:09         ` Jan Kratochvil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).