This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: pending breakpoints without any symbols loaded yet
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Mon, 18 Aug 2008 23:58:49 +0100
- Subject: Re: pending breakpoints without any symbols loaded yet
- References: <200804032031.13024.pedro@codesourcery.com>
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 <PENDING> 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 <PENDING> 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 <pedro@codesourcery.com>
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