From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26002 invoked by alias); 10 Nov 2004 23:53:51 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 25955 invoked from network); 10 Nov 2004 23:53:45 -0000 Received: from unknown (HELO pippin.tausq.org) (64.81.244.94) by sourceware.org with SMTP; 10 Nov 2004 23:53:45 -0000 Received: by pippin.tausq.org (Postfix, from userid 1000) id 05871CF086; Wed, 10 Nov 2004 15:51:50 -0800 (PST) Date: Wed, 10 Nov 2004 23:57:00 -0000 From: Randolph Chung To: gdb@sources.redhat.com Subject: dwarf2 and frame bases Message-ID: <20041110235149.GO15714@tausq.org> Reply-To: Randolph Chung Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-GPG: for GPG key, see http://www.tausq.org/gpg.txt User-Agent: Mutt/1.5.5.1+cvs20040105i X-SW-Source: 2004-11/txt/msg00100.txt.bz2 The "recurse" test has been failing on hppa for a long time. I think I finally understand what is happening, but not sure of a fix.... the symptom of the problem is that watchpoints fail during recursion: (gdb) watch b Watchpoint 2: b (gdb) continue Continuing. Watchpoint 2: b Old value = 0 New value = 10 recurse (a=10) at ../../../gdb-cvs/gdb/testsuite/gdb.base/recurse.c:19 19 b *= recurse (a - 1); (gdb) continue Continuing. Error evaluating expression for watchpoint 2 Cannot access memory at address 0x8 Watchpoint 2 deleted. hppa-linux uses dwarf2, and doesn't implement hardware watchpoints. The dwarf2 description for recurse looks like this: <1>: Abbrev Number: 2 (DW_TAG_subprogram) DW_AT_sibling : DW_AT_name : recurse DW_AT_decl_file : 1 DW_AT_decl_line : 12 DW_AT_type : DW_AT_low_pc : 0x10518 DW_AT_high_pc : 0x10598 DW_AT_frame_base : 1 byte block: 53 (DW_OP_reg3) <2>: Abbrev Number: 3 (DW_TAG_formal_parameter) DW_AT_name : a DW_AT_decl_file : 1 DW_AT_decl_line : 10 DW_AT_type : DW_AT_location : 2 byte block: 91 5c (DW_OP_fbreg: -36) <2>: Abbrev Number: 4 (DW_TAG_variable) DW_AT_name : b DW_AT_decl_file : 1 DW_AT_decl_line : 13 DW_AT_type : DW_AT_location : 2 byte block: 91 8 (DW_OP_fbreg: 8) what seems to happen is that, to implement the watchpoint, we singlestep through the code and evaluate 'b' at every insn. If we do this in the prologue, we fail. The dwarf location expression handler tries to get the frame base by using DW_AT_frame_base, which points to register 3, but register 3 is not yet initialized in the prologue, so when we read it, we get garbage. argh... I don't know enough about dwarf to know how this is supposed to be evaluated. Can someone please shed some light on this? thanks randolph -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/