From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8940 invoked by alias); 27 Feb 2007 04:46:32 -0000 Received: (qmail 8929 invoked by uid 22791); 27 Feb 2007 04:46:30 -0000 X-Spam-Check-By: sourceware.org Received: from nile.gnat.com (HELO nile.gnat.com) (205.232.38.5) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 27 Feb 2007 04:46:22 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-nile.gnat.com (Postfix) with ESMTP id B472E48CC5C for ; Mon, 26 Feb 2007 23:46:20 -0500 (EST) Received: from nile.gnat.com ([127.0.0.1]) by localhost (nile.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 00731-01-10 for ; Mon, 26 Feb 2007 23:46:20 -0500 (EST) Received: from takamaka.act-europe.fr (unknown [70.71.0.212]) by nile.gnat.com (Postfix) with ESMTP id F062C48CC1C for ; Mon, 26 Feb 2007 23:46:19 -0500 (EST) Received: by takamaka.act-europe.fr (Postfix, from userid 1000) id 40B79E7B41; Mon, 26 Feb 2007 20:46:23 -0800 (PST) Date: Tue, 27 Feb 2007 04:46:00 -0000 From: Joel Brobecker To: gdb-patches@sourceware.org Subject: [RFA] Fix crash when DW_AT_producer attribute is absent Message-ID: <20070227044623.GA13159@adacore.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="J2SCkAp4GZ/dPZZf" Content-Disposition: inline User-Agent: Mutt/1.4.2.2i Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-02/txt/msg00325.txt.bz2 --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1828 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 * buildsym.c (record_producer): Do nothing if no producer is provided. 2007-02-26 Joel Brobecker * 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 --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="buildsym.c.diff" Content-length: 600 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)); } --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="dw2-producer.S" Content-length: 5539 /* 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: --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="dw2-producer.exp" Content-length: 1733 # 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 \\(\\)" --J2SCkAp4GZ/dPZZf--