Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA] Fix crash when DW_AT_producer attribute is absent
@ 2007-02-27  4:46 Joel Brobecker
  2007-02-27 12:03 ` Daniel Jacobowitz
  0 siblings, 1 reply; 3+ messages in thread
From: Joel Brobecker @ 2007-02-27  4:46 UTC (permalink / raw)
  To: gdb-patches

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

Hello,

I noticed this because I was testing GDB on a a mips-irix machine
where it started crashing even on a simple "run". It turns out that
one of the files does not have a DW_AT_producer attribute:

 <0><1c6>: Abbrev Number: 1 (DW_TAG_compile_unit)
     DW_AT_high_pc     : 0x10002720
     DW_AT_low_pc      : 0x100025f0
     DW_AT_producer    : GNU C 3.4.6 for GNAT Pro 6.1.0w (20070225)
     DW_AT_language    : 1      (ANSI C)
     DW_AT_name        : /kern.a/gnatmail-5_34/build-kern/src/gcc/crtstuff.c

I am not quite sure why it is absent, but the DWARF reference manual
doesn't seem to indicate that it is mandatory. In any case, I was easily
able to reproduce the problem on x86-linux once I knew what the problem
was. I just created a new testcase for it, which is pretty much a shameless
copy of dw2-basic, with DW_AT_producer removed.

Here is how to reproduce the problem (using the testcase below):

    gdb dw2-producer.x
    (gdb) list func_cu1 
    [1]    21433 segmentation fault  ../../gdb dw2-producer.x

The crash happens because we do the following inside dwarf2read.c:

  attr = dwarf2_attr (die, DW_AT_producer, cu);
  if (attr)
    cu->producer = DW_STRING (attr);
  [...]
  record_producer (cu->producer);

  (but cu->producer is NULL)

One way of fixing this, of course, is to avoid the call to record_producer
if it's null. But I though it's play it the safe way, and add the guard
inside record_producer instead.

2007-02-26  Joel Brobecker  <brobecker@adacore.com>

        * buildsym.c (record_producer): Do nothing if no producer is provided.

2007-02-26  Joel Brobecker  <brobecker@adacore.com>

        * gdb.dwarf2/dw2-producer.S: New file.
        * gdb.dwarf2/dw2-producer.exp: New testcase.

Tested on x86-linux, no regression, fixes the attached testcase.
OK to apply?

Thanks,
-- 
Joel

[-- Attachment #2: buildsym.c.diff --]
[-- Type: text/plain, Size: 600 bytes --]

Index: buildsym.c
===================================================================
RCS file: /cvs/src/src/gdb/buildsym.c,v
retrieving revision 1.46
diff -u -p -r1.46 buildsym.c
--- buildsym.c	21 Jan 2007 16:49:40 -0000	1.46
+++ buildsym.c	27 Feb 2007 04:21:36 -0000
@@ -1139,6 +1139,11 @@ record_debugformat (char *format)
 void
 record_producer (const char *producer)
 {
+  /* The producer is not always provided in the debugging info.
+     Do nothing if PRODUCER is NULL.  */
+  if (producer == NULL)
+    return;
+
   current_subfile->producer = savestring (producer, strlen (producer));
 }
 

[-- Attachment #3: dw2-producer.S --]
[-- Type: text/plain, Size: 5539 bytes --]

/* This testcase is part of GDB, the GNU debugger.

   Copyright 2004, 2007 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   USA.  */

/* This file contains some basic DWARF info.  The only particularity about
   this info is that this compile unit does not have a DW_AT_producer
   attribute.  The rest is a straight copy of one of the other assembly
   files available in this directory.

   The intent of this testcase is to verify that GDB is able to handle
   the lack of the DW_AT_producer attribute without problem.  */

/* Dummy function to provide debug information for.  */

	.text
.Lbegin_text1:
	.globl func_cu1
	.type func_cu1, %function
func_cu1:
.Lbegin_func_cu1:
	.int 0
.Lend_func_cu1:
	.size func_cu1, .-func_cu1
.Lend_text1:

/* Debug information */

	.section .debug_info
.Lcu1_begin:
	/* CU header */
	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
.Lcu1_start:
	.2byte	2				/* DWARF Version */
	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
	.byte	4				/* Pointer size */

	/* CU die */
	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
	.4byte	.Lline1_begin			/* DW_AT_stmt_list */
	.4byte	.Lend_text1			/* DW_AT_high_pc */
	.4byte	.Lbegin_text1			/* DW_AT_low_pc */
	.ascii	"file1.txt\0"			/* DW_AT_name */
	.byte	1				/* DW_AT_language (C) */

	/* func_cu1 */
	.uleb128	2			/* Abbrev: DW_TAG_subprogram */
	.byte		1			/* DW_AT_external */
	.byte		1			/* DW_AT_decl_file */
	.byte		2			/* DW_AT_decl_line */
	.ascii		"func_cu1\0"		/* DW_AT_name */
	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
	.4byte		.Lbegin_func_cu1	/* DW_AT_low_pc */
	.4byte		.Lend_func_cu1		/* DW_AT_high_pc */
	.byte		1			/* DW_AT_frame_base: length */
	.byte		0x55			/* DW_AT_frame_base: DW_OP_reg5 */

.Ltype_int:
	.uleb128	3			/* Abbrev: DW_TAG_base_type */
	.ascii		"int\0"			/* DW_AT_name */
	.byte		4			/* DW_AT_byte_size */
	.byte		5			/* DW_AT_encoding */

	.byte		0			/* End of children of CU */

.Lcu1_end:

/* Abbrev table */
	.section .debug_abbrev
.Labbrev1_begin:
	.uleb128	1			/* Abbrev code */
	.uleb128	0x11			/* DW_TAG_compile_unit */
	.byte		1			/* has_children */
	.uleb128	0x10			/* DW_AT_stmt_list */
	.uleb128	0x6			/* DW_FORM_data4 */
	.uleb128	0x12			/* DW_AT_high_pc */
	.uleb128	0x1			/* DW_FORM_addr */
	.uleb128	0x11			/* DW_AT_low_pc */
	.uleb128	0x1			/* DW_FORM_addr */
	.uleb128	0x3			/* DW_AT_name */
	.uleb128	0x8			/* DW_FORM_string */
	.uleb128	0x13			/* DW_AT_language */
	.uleb128	0xb			/* DW_FORM_data1 */
	.byte		0x0			/* Terminator */
	.byte		0x0			/* Terminator */

	.uleb128	2			/* Abbrev code */
	.uleb128	0x2e			/* DW_TAG_subprogram */
	.byte		0			/* has_children */
	.uleb128	0x3f			/* DW_AT_external */
	.uleb128	0xc			/* DW_FORM_flag */
	.uleb128	0x3a			/* DW_AT_decl_file */
	.uleb128	0xb			/* DW_FORM_data1 */
	.uleb128	0x3b			/* DW_AT_decl_line */
	.uleb128	0xb			/* DW_FORM_data1 */
	.uleb128	0x3			/* DW_AT_name */
	.uleb128	0x8			/* DW_FORM_string */
	.uleb128	0x49			/* DW_AT_type */
	.uleb128	0x13			/* DW_FORM_ref4 */
	.uleb128	0x11			/* DW_AT_low_pc */
	.uleb128	0x1			/* DW_FORM_addr */
	.uleb128	0x12			/* DW_AT_high_pc */
	.uleb128	0x1			/* DW_FORM_addr */
	.uleb128	0x40			/* DW_AT_frame_base */
	.uleb128	0xa			/* DW_FORM_block1 */
	.byte		0x0			/* Terminator */
	.byte		0x0			/* Terminator */

	.uleb128	3			/* Abbrev code */
	.uleb128	0x24			/* DW_TAG_base_type */
	.byte		0			/* has_children */
	.uleb128	0x3			/* DW_AT_name */
	.uleb128	0x8			/* DW_FORM_string */
	.uleb128	0xb			/* DW_AT_byte_size */
	.uleb128	0xb			/* DW_FORM_data1 */
	.uleb128	0x3e			/* DW_AT_encoding */
	.uleb128	0xb			/* DW_FORM_data1 */
	.byte		0x0			/* Terminator */
	.byte		0x0			/* Terminator */

	.byte		0x0			/* Terminator */
	.byte		0x0			/* Terminator */

/* Line table */
	.section .debug_line
.Lline1_begin:
	.4byte		.Lline1_end - .Lline1_start	/* Initial length */
.Lline1_start:
	.2byte		2			/* Version */
	.4byte		.Lline1_lines - .Lline1_hdr	/* header_length */
.Lline1_hdr:
	.byte		1			/* Minimum insn length */
	.byte		1			/* default_is_stmt */
	.byte		1			/* line_base */
 	.byte		1			/* line_range */
	.byte		0x10			/* opcode_base */

	/* Standard lengths */
	.byte		0
	.byte		1
	.byte		1
	.byte		1
	.byte		1
	.byte		0
	.byte		0
	.byte		0
	.byte		1
	.byte		0
	.byte		0
	.byte		1
	.byte		0
	.byte		0
	.byte		0

	/* Include directories */
	.byte		0

	/* File names */
	.ascii		"file1.txt\0"
	.uleb128	0
	.uleb128	0
	.uleb128	0

	.byte		0

.Lline1_lines:
	.byte		0	/* DW_LNE_set_address */
	.uleb128	5
	.byte		2
	.4byte		.Lbegin_func_cu1

	.byte		3	/* DW_LNS_advance_line */
	.sleb128	3	/* ... to 4 */

	.byte		1	/* DW_LNS_copy */

	.byte		1	/* DW_LNS_copy (second time as an end-of-prologue marker) */

	.byte		0	/* DW_LNE_set_address */
	.uleb128	5
	.byte		2
	.4byte		.Lend_func_cu1

	.byte		0	/* DW_LNE_end_of_sequence */
	.uleb128	1
	.byte		1

.Lline1_end:

[-- Attachment #4: dw2-producer.exp --]
[-- Type: text/plain, Size: 1733 bytes --]

# Copyright 2004, 2005, 2007 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Minimal DWARF-2 unit test

# This test can only be run on targets which support DWARF-2 and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget *-*-openbsd*]
    && ![istarget arm-*-eabi*]
    && ![istarget powerpc-*-eabi*]} {
    return 0  
}

set testfile "dw2-producer"
set srcfile ${testfile}.S
set binfile ${objdir}/${subdir}/${testfile}.x

if  { [gdb_compile "${srcdir}/${subdir}/main.c" "main.o" object {debug}] != "" } {
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${testfile}.o" object {nodebug}] != "" } {
    return -1
}

if  { [gdb_compile "${testfile}.o main.o" "${binfile}" executable {debug}] != "" } {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "set listsize 1" ""
gdb_test "list func_cu1" "4\[ \t\]+File 1 Line 4"
gdb_test "ptype func_cu1" "type = int \\(\\)"

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

end of thread, other threads:[~2007-02-27 23:08 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-27  4:46 [RFA] Fix crash when DW_AT_producer attribute is absent Joel Brobecker
2007-02-27 12:03 ` Daniel Jacobowitz
2007-02-27 23:08   ` Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox