From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31654 invoked by alias); 1 Jul 2010 12:43:14 -0000 Received: (qmail 31641 invoked by uid 22791); 1 Jul 2010 12:43:13 -0000 X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,TW_DL,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 01 Jul 2010 12:43:08 +0000 Received: (qmail 30109 invoked from network); 1 Jul 2010 12:43:07 -0000 Received: from unknown (HELO orlando.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 1 Jul 2010 12:43:07 -0000 From: Pedro Alves To: gdb-patches@sourceware.org, Tom Tromey Subject: collecting optimized out variables regression (Re: RFA: rewrite dwarf->ax translator (Was: RFC: implement DW_OP_bit_piece)) Date: Thu, 01 Jul 2010 12:43:00 -0000 User-Agent: KMail/1.13.2 (Linux/2.6.31-10-rt; KDE/4.4.2; x86_64; ; ) Cc: Stan Shebs , Jan Kratochvil References: In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201007011343.00392.pedro@codesourcery.com> X-IsSubscribed: yes 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: 2010-07/txt/msg00002.txt.bz2 Hi Tom, After the rewrite, I'm seeing this: (gdb) p m $1 = (gdb) maint agent m ../../src/gdb/utils.c:1363: internal-error: virtual memory exhausted: can't allocate 562945039736192 bytes. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) #0 internal_error (file=0x7531ac "../../src/gdb/utils.c", line=1363, string=0x753568 "virtual memory exhausted: can't allocate %ld bytes.") at ../../src/gdb/utils.c:1162 #1 0x0000000000417464 in nomem (size=562949953380224) at ../../src/gdb/utils.c:1363 #2 0x00000000004174c3 in xmalloc (size=562949953380224) at ../../src/gdb/utils.c:1394 #3 0x00000000005b1ac7 in compile_dwarf_to_ax (expr=0xebd020, loc=0x7fffffffd9b0, arch=0xcc9a20, addr_size=8, op_ptr=0x0, op_end=0x7fffffffd7e0 " \320\353", per_cu=0xcada90) at ../../src/gdb/dwarf2loc.c:1220 #4 0x00000000005b4b78 in loclist_tracepoint_var_ref (symbol=0xd22c30, gdbarch=0xcc9a20, ax=0xebd020, value=0x7fffffffd9b0) at ../../src/gdb/dwarf2loc.c:2572 #5 0x000000000048be46 in gen_var_ref (gdbarch=0xcc9a20, ax=0xebd020, value=0x7fffffffd9b0, var=0xd22c30) at ../../src/gdb/ax-gdb.c:713 #6 0x000000000048e570 in gen_expr (exp=0xed5280, pc=0x7fffffffd9c8, ax=0xebd020, value=0x7fffffffd9b0) at ../../src/gdb/ax-gdb.c:1962 #7 0x000000000048f92a in gen_trace_for_expr (scope=4197499, expr=0xed5280) at ../../src/gdb/ax-gdb.c:2387 #8 0x000000000048fabc in agent_command (exp=0xb4821c "m", from_tty=1) at ../../src/gdb/ax-gdb.c:2456 The xmalloc in question is this: offsets = xmalloc ((op_end - op_ptr) * sizeof (int)); `op_end' and `op_ptr' are `data' and `data + size' in loclist_tracepoint_var_ref: data = find_location_expression (dlbaton, &size, ax->scope); compile_dwarf_to_ax (ax, value, gdbarch, addr_size, data, data + size, dlbaton->per_cu); where: (top-gdb) p data $1 = (const gdb_byte *) 0x0 (top-gdb) p size $2 = 140737488345056 (top-gdb) p /x $3 = 0x7fffffffd7e0 whoops. On Thursday 03 June 2010 21:12:13, Tom Tromey wrote: > (dwarf2_tracepoint_var_ref): Likewise. > (locexpr_tracepoint_var_ref): Use compile_dwarf_to_ax. > (loclist_tracepoint_var_ref): Likewise. > -static void > -dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, > - struct agent_expr *ax, struct axs_value *value, > - const gdb_byte *data, int size) > -{ (...) > - > - if (!data || size == 0) > - { > - value->optimized_out = 1; > - return; > - } Apparently, this bit was lost with the rewrite. (...) > @@ -1813,9 +2269,10 @@ locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, > struct agent_expr *ax, struct axs_value *value) > { > struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); > + unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); > > - dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, > - dlbaton->data, dlbaton->size); > + compile_dwarf_to_ax (ax, value, gdbarch, addr_size, > + dlbaton->data, dlbaton->data + dlbaton->size); > } > > /* The set of location functions used with the DWARF-2 expression > @@ -1957,10 +2414,11 @@ loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, > struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); > const gdb_byte *data; > size_t size; > + unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); > > data = find_location_expression (dlbaton, &size, ax->scope); > > - dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size); > + compile_dwarf_to_ax (ax, value, gdbarch, addr_size, data, data + size); > } This patch fixes it for me. Is this the correct approach, or maybe there was intent to handle this differently? -- Pedro Alves 2010-07-01 Pedro Alves * dwarf2loc.c (locexpr_tracepoint_var_ref) (loclist_tracepoint_var_ref): Handle optimized out values. --- gdb/dwarf2loc.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) Index: src/gdb/dwarf2loc.c =================================================================== --- src.orig/gdb/dwarf2loc.c 2010-07-01 12:19:35.000000000 +0100 +++ src/gdb/dwarf2loc.c 2010-07-01 13:32:38.000000000 +0100 @@ -2416,9 +2416,12 @@ locexpr_tracepoint_var_ref (struct symbo struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol); unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); - compile_dwarf_to_ax (ax, value, gdbarch, addr_size, - dlbaton->data, dlbaton->data + dlbaton->size, - dlbaton->per_cu); + if (dlbaton->data == NULL || dlbaton->size == 0) + value->optimized_out = 1; + else + compile_dwarf_to_ax (ax, value, gdbarch, addr_size, + dlbaton->data, dlbaton->data + dlbaton->size, + dlbaton->per_cu); } /* The set of location functions used with the DWARF-2 expression @@ -2568,9 +2571,11 @@ loclist_tracepoint_var_ref (struct symbo unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); data = find_location_expression (dlbaton, &size, ax->scope); - - compile_dwarf_to_ax (ax, value, gdbarch, addr_size, data, data + size, - dlbaton->per_cu); + if (data == NULL || size == 0) + value->optimized_out = 1; + else + compile_dwarf_to_ax (ax, value, gdbarch, addr_size, data, data + size, + dlbaton->per_cu); } /* The set of location functions used with the DWARF-2 expression