* pending breakpoints without any symbols loaded yet
@ 2008-04-03 20:24 Pedro Alves
2008-08-18 22:58 ` Pedro Alves
0 siblings, 1 reply; 4+ messages in thread
From: Pedro Alves @ 2008-04-03 20:24 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1787 bytes --]
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
[-- Attachment #2: pending.diff --]
[-- Type: text/x-diff, Size: 3142 bytes --]
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-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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: pending breakpoints without any symbols loaded yet
2008-04-03 20:24 pending breakpoints without any symbols loaded yet Pedro Alves
@ 2008-08-18 22:58 ` Pedro Alves
2008-08-19 22:48 ` Michael Snyder
0 siblings, 1 reply; 4+ messages in thread
From: Pedro Alves @ 2008-08-18 22:58 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 3539 bytes --]
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.
[-- Attachment #2: pending.diff --]
[-- Type: text/x-diff, Size: 3142 bytes --]
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: pending breakpoints without any symbols loaded yet
2008-08-18 22:58 ` Pedro Alves
@ 2008-08-19 22:48 ` Michael Snyder
2008-08-20 11:49 ` Pedro Alves
0 siblings, 1 reply; 4+ messages in thread
From: Michael Snyder @ 2008-08-19 22:48 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
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 <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
>>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: pending breakpoints without any symbols loaded yet
2008-08-19 22:48 ` Michael Snyder
@ 2008-08-20 11:49 ` Pedro Alves
0 siblings, 0 replies; 4+ messages in thread
From: Pedro Alves @ 2008-08-20 11:49 UTC (permalink / raw)
To: gdb-patches; +Cc: Michael Snyder
On Tuesday 19 August 2008 23:45:54, Michael Snyder wrote:
> This looks good to me...
Thanks, it's in.
--
Pedro Alves
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-08-20 11:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-03 20:24 pending breakpoints without any symbols loaded yet Pedro Alves
2008-08-18 22:58 ` Pedro Alves
2008-08-19 22:48 ` Michael Snyder
2008-08-20 11:49 ` Pedro Alves
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox