This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: pending breakpoints without any symbols loaded yet


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
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]