From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30618 invoked by alias); 13 Jun 2009 10:21:24 -0000 Received: (qmail 30609 invoked by uid 22791); 13 Jun 2009 10:21:23 -0000 X-SWARE-Spam-Status: No, hits=-0.2 required=5.0 tests=AWL,BAYES_00,BELOVED_BODY,J_CHICKENPOX_43,J_CHICKENPOX_48,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 13 Jun 2009 10:21:15 +0000 Received: (qmail 9801 invoked from network); 13 Jun 2009 10:21:13 -0000 Received: from unknown (HELO wind.localnet) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 13 Jun 2009 10:21:13 -0000 From: Vladimir Prus To: gdb@sources.redhat.com Subject: Re: Robustifying pretty-printers Date: Sat, 13 Jun 2009 10:21:00 -0000 User-Agent: KMail/1.11.90 (Linux/2.6.24-24-generic; KDE/4.2.90; i686; svn-979530; 2009-06-10) References: <200906131411.34204.vladimir@codesourcery.com> In-Reply-To: <200906131411.34204.vladimir@codesourcery.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200906131421.24719.vladimir@codesourcery.com> Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2009-06/txt/msg00133.txt.bz2 On Saturday 13 June 2009 you wrote: > > While playing with pretty-printers and KDevelop, I've got GDB > to "hang", with the below backtrace: > > (gdb) where > #0 0xb7d0ed2a in strcmp () from /lib/tls/i686/cmov/libc.so.6 > #1 0x081be1a7 in install_variable (var=0x191b0620) at /home/ghost/Work/CodeSourcery/Projects/egdb/gdb-cvs/gdb/varobj.c:1731 > #2 0x081beef7 in create_child_with_value (parent=0x8a6e158, index=514255, name=0xb7bf8e14 "[514255]", value=0x191b03d0) > at /home/ghost/Work/CodeSourcery/Projects/egdb/gdb-cvs/gdb/varobj.c:1859 > > The '514255' above is sufficient to understand what happened. Our beloved GCC fails to emit > proper debug info, therefore a vector is considered in scope before constructor is executed, > and the vector is full of random bits. > > Now, what are the best strategies for fix this (assuming GCC won't be > fixed for 10 years to come)? One approach is to make IDE check at what > line the variable is declared, and don't try to pretty-print it unless > the current line is above that. Alternatively, we might need to revive > the code to limit the number of children to fetch, and use some reasonable > limit, like 10. Comments? In fact, there's yet another case: class StdStringPrinter: "Print a std::basic_string of some kind" def __init__(self, encoding, val): self.encoding = encoding self.val = val def to_string(self): # Look up the target encoding as late as possible. encoding = self.encoding if encoding == 0: encoding = gdb.parameter('target-charset') elif encoding == 1: encoding = gdb.parameter('target-wide-charset') elif isinstance(encoding, WideEncoding): encoding = encoding.value return self.val['_M_dataplus']['_M_p'].string(encoding) I am not quite sure where the 'string' method is defined, so the question is -- assuming I know the expected size of the string. How do I make the 'string' method not to fetch more than that? - Volodya