From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26120 invoked by alias); 3 Apr 2008 19:31:55 -0000 Received: (qmail 26106 invoked by uid 22791); 3 Apr 2008 19:31:54 -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; Thu, 03 Apr 2008 19:31:27 +0000 Received: (qmail 22955 invoked from network); 3 Apr 2008 19:31:20 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 3 Apr 2008 19:31:20 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: pending breakpoints without any symbols loaded yet Date: Thu, 03 Apr 2008 20:24:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_ACT9HcwQYu5njKx" Message-Id: <200804032031.13024.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-04/txt/msg00078.txt.bz2 --Boundary-00=_ACT9HcwQYu5njKx Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1787 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. -- Pedro Alves --Boundary-00=_ACT9HcwQYu5njKx 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-04-02 20:39:34.000000000 +0100 +++ src/gdb/linespec.c 2008-04-03 19:14:17.000000000 +0100 @@ -1534,10 +1534,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); } @@ -1744,12 +1745,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-04-03 19:15:11.000000000 +0100 +++ src/gdb/testsuite/gdb.base/pending.exp 2008-04-03 19:29:42.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=_ACT9HcwQYu5njKx--