From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14295 invoked by alias); 19 Aug 2008 22:48:15 -0000 Received: (qmail 14284 invoked by uid 22791); 19 Aug 2008 22:48:14 -0000 X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 19 Aug 2008 22:47:25 +0000 Received: from mailhost5.vmware.com (unknown [10.16.68.131]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 4EE7541027; Tue, 19 Aug 2008 15:47:22 -0700 (PDT) Received: from [10.20.92.47] (promb-2s-dhcp47.eng.vmware.com [10.20.92.47]) by mailhost5.vmware.com (Postfix) with ESMTP id 9DC12DC067; Tue, 19 Aug 2008 15:48:34 -0700 (PDT) Message-ID: <48AB4D22.8050704@vmware.com> Date: Tue, 19 Aug 2008 22:48:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: Pedro Alves CC: "gdb-patches@sourceware.org" Subject: Re: pending breakpoints without any symbols loaded yet References: <200804032031.13024.pedro@codesourcery.com> <200808182358.49164.pedro@codesourcery.com> In-Reply-To: <200808182358.49164.pedro@codesourcery.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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: 2008-08/txt/msg00532.txt.bz2 This looks good to me... Pedro Alves wrote: > Ping? > > Is has been a couple of months, so below are some examples of what this patch > enables. > > Before, this was possible (we have symbols loaded): > >> gdb ./gdb/gdb --quiet > (gdb) b foobar > Function "foobar" not defined. > Make breakpoint pending on future shared library load? (y or [n]) y > Breakpoint 1 (foobar) pending. > (gdb) info b > Num Type Disp Enb Address What > 1 breakpoint keep y foobar > (gdb) > > But this was not (no symbols loaded):: > >> gdb --quiet > (gdb) b main > No symbol table is loaded. Use the "file" command. > (gdb) > > With the patch installed, this is now possible (no symbols loaded): > >> ./gdb/gdb --quiet > (gdb) b main > No symbol table is loaded. Use the "file" command. > Make breakpoint pending on future shared library load? (y or [n]) y > Breakpoint 1 (main) pending. > (gdb) info breakpoints > Num Type Disp Enb Address What > 1 breakpoint keep y main > > Now load symbols: > > (gdb) file gdb/gdb > Reading symbols from /home/pedro/gdb/pending/build/gdb/gdb...done. > > And the pending breakpoint is resolved using the normal > pending breakpoint mechanisms: > > (gdb) info breakpoints > Num Type Disp Enb Address What > 1 breakpoint keep y 0x000000000044ee37 in main > at ../../src/gdb/gdb.c:28 > (gdb) r > Starting program: /home/pedro/gdb/pending/build/gdb/gdb > [Thread debugging using libthread_db enabled] > > Breakpoint 1, main (argc=1, argv=0x7fffffffe458) at ../../src/gdb/gdb.c:28 > 28 memset (&args, 0, sizeof args); > (gdb) > > Retested on x86_64-unknown-linux-gnu, no regressions, > new test passes. > > -- > Pedro Alves > > > On Thursday 03 April 2008 20:31:11, Pedro Alves wrote: >> Hi all, >> >> This is a follow up to a discussion that started a few months ago >> related to setting breakpoints in shared lib when you don't have >> any symbols in the main executable. This is more visible >> on Windows when you want debugging a dll you build with gcc that >> is loaded by a stripped application built with MSVC. We can't >> debug the MSVC built executable, but we should be able >> to debug the code in the dll. Users should be able to set >> breakpoints in the dll before it gets loaded, but gdb refuses >> to, claiming: >> >> (gdb) b func_in_dll >> No symbol table is loaded. Use the "file" command. >> >> Original patch and discussion here: >> [Debugging a Vlc dll with GDB.] >> http://sourceware.org/ml/gdb-patches/2007-12/msg00112.html >> >> Coincidently, Matt Rice was asking on IRC why he couldn't >> set pending breakpoints in his .gdbinit file, which >> made me come back to the issue. It's exactly the same >> checks in gdb. This patch should also fix his use case. >> >> At the time of that thread, I proposed a patch the removes the >> limitation, by letting the user set pending breakpoints even >> if no symbols are loaded yet, but I also changed the >> messages we output, but in a form not everyone liked. As >> we were discussing then, the messages gdb prints aren't >> 100% accurate -- if we let the user set pending breakpoints >> before an exec file is loaded, the question we ask is still >> "Make breakapoints pending on future shared library load?". I >> spent quite some time staring at the messages we output, and >> trying to come up with a good generic one, but the ones >> I came up with, still had this feeling they would be >> rejected again. :-) >> >> So, this time I propose a code change only. Let's make >> message changes separately. >> >> Here goes the patch. Testcase included. Tested on >> x86_64-unknown-linux-gnu. >> >> ------------------------------------------------------------------------ >> >> 2008-04-03 Pedro Alves >> >> gdb/ >> * linespec.c (symtab_from_filename): Also throw NOT_FOUND_ERROR if >> there are no symbols loaded, instead of throwing a generic error. >> (decode_variable): Likewise. >> >> gdb/testsuite/ >> * gdb.base/pending.exp: Test pending breakpoints without symbols >> loaded. >> >> --- >> gdb/linespec.c | 15 +++++++++------ >> gdb/testsuite/gdb.base/pending.exp | 26 ++++++++++++++++++++++++++ >> 2 files changed, 35 insertions(+), 6 deletions(-) >> >> Index: src/gdb/linespec.c >> =================================================================== >> --- src.orig/gdb/linespec.c 2008-08-18 21:42:42.000000000 +0100 >> +++ src/gdb/linespec.c 2008-08-18 21:43:30.000000000 +0100 >> @@ -1556,10 +1556,11 @@ symtab_from_filename (char **argptr, cha >> file_symtab = lookup_symtab (copy); >> if (file_symtab == 0) >> { >> - if (!have_full_symbols () && !have_partial_symbols ()) >> - error (_("No symbol table is loaded. Use the \"file\" command.")); >> if (not_found_ptr) >> *not_found_ptr = 1; >> + if (!have_full_symbols () && !have_partial_symbols ()) >> + throw_error (NOT_FOUND_ERROR, >> + _("No symbol table is loaded. Use the \"file\" command.")); >> throw_error (NOT_FOUND_ERROR, _("No source file named %s."), copy); >> } >> >> @@ -1760,12 +1761,14 @@ decode_variable (char *copy, int funfirs >> if (msymbol != NULL) >> return minsym_found (funfirstline, msymbol); >> >> - if (!have_full_symbols () && >> - !have_partial_symbols () && !have_minimal_symbols ()) >> - error (_("No symbol table is loaded. Use the \"file\" command.")); >> - >> if (not_found_ptr) >> *not_found_ptr = 1; >> + >> + if (!have_full_symbols () >> + && !have_partial_symbols () >> + && !have_minimal_symbols ()) >> + throw_error (NOT_FOUND_ERROR, >> + _("No symbol table is loaded. Use the \"file\" command.")); >> throw_error (NOT_FOUND_ERROR, _("Function \"%s\" not defined."), copy); >> } >> >> Index: src/gdb/testsuite/gdb.base/pending.exp >> =================================================================== >> --- src.orig/gdb/testsuite/gdb.base/pending.exp 2008-08-18 21:42:42.000000000 +0100 >> +++ src/gdb/testsuite/gdb.base/pending.exp 2008-08-18 21:43:30.000000000 +0100 >> @@ -54,6 +54,32 @@ if { [gdb_compile_shlib $libsrc $lib_sl >> gdb_exit >> gdb_start >> gdb_reinitialize_dir $srcdir/$subdir >> + >> +gdb_test_multiple "break pendfunc1" "set pending breakpoint" { >> + -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { >> + gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint (without symbols)" >> + } >> +} >> + >> +gdb_test "info break" \ >> + "Num Type\[ \]+Disp Enb Address\[ \]+What.* >> +\[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.*" \ >> +"single pending breakpoint info (without symbols)" >> + >> +gdb_load ${binfile} >> +gdb_load_shlibs $lib_sl >> + >> +set pendfunc1_loc [gdb_get_line_number "y = x + 4" ${libfile}.c] >> +gdb_test "run" \ >> +".*Breakpoint.*pendfunc1.*at.*pendshr.c:$pendfunc1_loc.*y = x \\+ 4.*" \ >> +"run to resolved breakpoint 1 (without symbols)" >> + >> +# Restart with a fresh gdb. >> + >> +gdb_exit >> +gdb_start >> +gdb_reinitialize_dir $srcdir/$subdir >> + >> gdb_load ${binfile} >> gdb_load_shlibs $lib_sl >>