From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: Joel Brobecker <brobecker@adacore.com>
Cc: Tom Tromey <tromey@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [patch] Fix internal error on breaking at a multi-locations caller
Date: Sun, 10 May 2009 18:33:00 -0000 [thread overview]
Message-ID: <20090510183249.GA12441@host0.dyn.jankratochvil.net> (raw)
In-Reply-To: <20090506165143.GM10734@adacore.com>
Hi Joel,
still requesting approval now just for the ChangeLog entry.
On Wed, 06 May 2009 18:51:43 +0200, Joel Brobecker wrote:
> The code part is OK, but I was a little confused by the comment.
I agree my comment was misleading, used now yours.
> > +# PC should not be at the boundary of source lines to make the original bug
> > +# exploitable.
> > +
> > +set test "p/x \$pc"
> > +set pc {}
> > +gdb_test_multiple $test $test {
> > + -re "\\$\[0-9\]+ = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
> > + set pc $expect_out(1,string)
> > + pass $test
> > + }
> > +}
> > +
> > +set test "info line"
> > +set end {}
> > +gdb_test_multiple $test $test {
> > + -re "Line \[0-9\]+ of .* starts at address 0x\[0-9a-f\]+.* and ends at (0x\[0-9a-f\]+).*\\.\r\n$gdb_prompt $" {
> > + set end $expect_out(1,string)
> > + pass $test
> > + }
> > +}
> > +
> > +set test "caller line has trailing code"
> > +if {$pc != $end} {
> > + pass $test
> > +} else {
> > + fail $test
> > +}
>
> I don't think this is right - the fail here is conditional on the code
> generated by the compiler on the given platform. If the return address
> points at the beginning of the next line of code, then our testcase
> won't allow us to test the issue. But there's no real failure
> demonstrated at this point.
I agree just chose it as the least worse way out: FAIL did mean a bug in the
testcase itself as it did not force the system compiler to produce code
acceptable for the testing. Some UNRESOLVED/XFAIL would be probably the right
result code but one may not give enough priority for such regression.
> My feeling on this is that we should just do the testing you do after
> without worrying whether the break address is at the beginning of
> a line or not. So I'd just ditch the above, and keep the rest of
> the testcase as is.
OK, removed this part of code as it should never happen. Put there now:
+# PC should not be now at the boundary of source lines to make the original bug
+# exploitable. The GLOBAL_X variable exists in the source for this purpose.
Thanks,
Jan
gdb/
2009-05-10 Joel Brobecker <brobecker@adacore.com>
Fix internal error on breaking at a multi-locations caller source line.
* breakpoint.c (parse_breakpoint_sals): Set EXPLICIT_PC for the `break'
command with no parameters.
gdb/testsuite/
2009-05-10 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.cp/expand-sals.exp, gdb.cp/expand-sals.cc: New.
--- gdb/breakpoint.c 5 May 2009 13:24:48 -0000 1.393
+++ gdb/breakpoint.c 10 May 2009 18:22:47 -0000
@@ -5494,6 +5494,14 @@ parse_breakpoint_sals (char **address,
sal.line = default_breakpoint_line;
sal.symtab = default_breakpoint_symtab;
sal.section = find_pc_overlay (sal.pc);
+
+ /* "break" without arguments is equivalent to "break *PC" where PC is
+ the default_breakpoint_address. So make sure to set
+ sal.explicit_pc to prevent GDB from trying to expand the list of
+ sals to include all other instances with the same symtab and line.
+ */
+ sal.explicit_pc = 1;
+
sals->sals[0] = sal;
sals->nelts = 1;
}
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.cp/expand-sals.cc 10 May 2009 18:22:47 -0000
@@ -0,0 +1,53 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+func ()
+{
+ return 42; /* func-line */
+}
+
+volatile int global_x;
+
+class A
+{
+public:
+ A ()
+ {
+ global_x = func (); /* caller-line */
+ }
+};
+
+/* class B is here just to make the `func' calling line above having multiple
+ instances - multiple locations. Template cannot be used as its instances
+ would have different function names which get discarded by GDB
+ expand_line_sal_maybe. */
+
+class B : public A
+{
+};
+
+int
+main (void)
+{
+ A a;
+ B b;
+
+ return 0; /* exit-line */
+}
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.cp/expand-sals.exp 10 May 2009 18:22:47 -0000
@@ -0,0 +1,58 @@
+# Copyright 2009 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if { [skip_cplus_tests] } { continue }
+
+set srcfile expand-sals.cc
+if { [prepare_for_testing expand-sals.exp expand-sals $srcfile {debug c++}] } {
+ return -1
+}
+if ![runto_main] {
+ return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "exit-line"]
+
+gdb_breakpoint [gdb_get_line_number "func-line"]
+gdb_continue_to_breakpoint "func" ".*func-line.*"
+
+gdb_test "up" "caller-line.*"
+
+# PC should not be now at the boundary of source lines to make the original bug
+# exploitable. The GLOBAL_X variable exists in the source for this purpose.
+
+# Original problem was an internal error here.
+set test "break"
+gdb_test_multiple $test $test {
+ -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\. \\(\[2-9\] locations\\)\r\n$gdb_prompt $" {
+ fail $test
+ }
+ -re "Breakpoint \[0-9\]+ at .*, line \[0-9\]+\\.\r\n$gdb_prompt $" {
+ pass $test
+ }
+}
+
+gdb_continue_to_breakpoint "caller" ".*caller-line.*"
+
+# Test GDB caught this return call and not the next one through B::B()
+gdb_test "bt" \
+ "#0 \[^\r\n\]* A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \
+ "bt from A"
+
+gdb_continue_to_breakpoint "next caller func" ".*func-line.*"
+
+# Verify GDB really could not catch any other breakpoint location.
+
+gdb_continue_to_breakpoint "uncaught return" ".*exit-line.*"
next prev parent reply other threads:[~2009-05-10 18:33 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-09 22:17 Jan Kratochvil
2009-04-24 1:01 ` Tom Tromey
2009-04-28 20:32 ` Joel Brobecker
2009-05-01 9:20 ` Jan Kratochvil
2009-05-01 15:48 ` Joel Brobecker
2009-05-01 17:32 ` Jan Kratochvil
2009-05-06 16:51 ` Joel Brobecker
2009-05-10 18:33 ` Jan Kratochvil [this message]
2009-05-11 9:11 ` Joel Brobecker
2009-05-11 15:07 ` Jan Kratochvil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090510183249.GA12441@host0.dyn.jankratochvil.net \
--to=jan.kratochvil@redhat.com \
--cc=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox