* [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
* Re: [RFA] Fix crash when DW_AT_producer attribute is absent
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
0 siblings, 1 reply; 3+ messages in thread
From: Daniel Jacobowitz @ 2007-02-27 12:03 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
On Mon, Feb 26, 2007 at 08:46:23PM -0800, Joel Brobecker wrote:
> 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)
Whoops, that was sloppy of me. OK and thanks.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFA] Fix crash when DW_AT_producer attribute is absent
2007-02-27 12:03 ` Daniel Jacobowitz
@ 2007-02-27 23:08 ` Joel Brobecker
0 siblings, 0 replies; 3+ messages in thread
From: Joel Brobecker @ 2007-02-27 23:08 UTC (permalink / raw)
To: gdb-patches
> > 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)
>
> OK and thanks.
Thanks Daniel. Checked in.
--
Joel
^ 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