From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26028 invoked by alias); 18 Aug 2008 22:58:59 -0000 Received: (qmail 26020 invoked by uid 22791); 18 Aug 2008 22:58:58 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 18 Aug 2008 22:58:09 +0000 Received: (qmail 17207 invoked from network); 18 Aug 2008 22:58:07 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 18 Aug 2008 22:58:07 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: pending breakpoints without any symbols loaded yet Date: Mon, 18 Aug 2008 22:58:00 -0000 User-Agent: KMail/1.9.9 References: <200804032031.13024.pedro@codesourcery.com> In-Reply-To: <200804032031.13024.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_p6fqIEUHeeWCXtv" Message-Id: <200808182358.49164.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: 2008-08/txt/msg00506.txt.bz2 --Boundary-00=_p6fqIEUHeeWCXtv Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 3539 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. --Boundary-00=_p6fqIEUHeeWCXtv Content-Type: text/x-diff; charset="utf-8"; name="pending.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pending.diff" Content-length: 3142 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 --Boundary-00=_p6fqIEUHeeWCXtv--