diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/breakpoint.c | 20 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/dprintf-bp-same-addr.c | 28 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/dprintf-bp-same-addr.exp | 66 |
5 files changed, 120 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1d37c56..d8f1cbe 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2014-06-02 Pedro Alves <palves@redhat.com> + * breakpoint.c (build_target_command_list): Don't build a command + list if we have any duplicate location that isn't a dprintf. + +2014-06-02 Pedro Alves <palves@redhat.com> + * breakpoint.c (dprintf_breakpoint_hit): New function. (initialize_breakpoint_ops): Install it as dprintf's breakpoint_hit method. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index a966ba2..4e6c627 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2351,14 +2351,26 @@ build_target_command_list (struct bp_location *bl) /* Release commands left over from a previous insert. */ VEC_free (agent_expr_p, bl->target_info.tcommands); - /* For now, limit to agent-style dprintf breakpoints. */ - if (bl->owner->type != bp_dprintf - || strcmp (dprintf_style, dprintf_style_agent) != 0) + if (!target_can_run_breakpoint_commands ()) return; - if (!target_can_run_breakpoint_commands ()) + /* For now, limit to agent-style dprintf breakpoints. */ + if (dprintf_style != dprintf_style_agent) return; + /* For now, if we have any duplicate location that isn't a dprintf, + don't install the target-side commands, as that would make the + breakpoint not be reported to the core, and we'd lose + control. */ + ALL_BP_LOCATIONS_AT_ADDR (loc2p, locp, bl->address) + { + loc = (*loc2p); + if (is_breakpoint (loc->owner) + && loc->pspace->num == bl->pspace->num + && loc->owner->type != bp_dprintf) + return; + } + /* Do a first pass to check for locations with no assigned conditions or conditions that fail to parse to a valid agent expression bytecode. If any of these happen, then it's no use to send conditions diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index eed85c1..f4d59cf 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-06-02 Pedro Alves <palves@redhat.com> + + * gdb.base/dprintf-bp-same-addr.c: New file. + * gdb.base/dprintf-bp-same-addr.exp: New file. + 2014-06-02 Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com> * gdb.arch/powerpc-power.exp: Add power8 instructions to the testcase. diff --git a/gdb/testsuite/gdb.base/dprintf-bp-same-addr.c b/gdb/testsuite/gdb.base/dprintf-bp-same-addr.c new file mode 100644 index 0000000..b28e102 --- /dev/null +++ b/gdb/testsuite/gdb.base/dprintf-bp-same-addr.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2014 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/>. */ + +int +main (void) +{ + int x = 1, y = 1, z = 1; + + ++x; /* before dprintf */ + ++y; /* set dprintf here */ + ++z; /* after dprintf */ + + return 0; +} diff --git a/gdb/testsuite/gdb.base/dprintf-bp-same-addr.exp b/gdb/testsuite/gdb.base/dprintf-bp-same-addr.exp new file mode 100644 index 0000000..b0c6d7b --- /dev/null +++ b/gdb/testsuite/gdb.base/dprintf-bp-same-addr.exp @@ -0,0 +1,66 @@ +# Copyright 2014 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/>. + +# Test that GDB doesn't lose control when a breakpoint is set at the +# same address as a dprintf. + +standard_testfile + +if [prepare_for_testing "failed to prepare" \ + ${testfile} ${srcfile} {debug}] { + return -1 +} + +set dp_location [gdb_get_line_number "set dprintf here"] + +proc test { style } { + global gdb_prompt binfile dp_location + + with_test_prefix "$style" { + clean_restart $binfile + + if ![runto_main] { + fail "Can't run to main" + return -1 + } + + delete_breakpoints + + gdb_test_no_output "set dprintf-style $style" + + # Enable always-inserted so we can control the breakpoint + # insertion order. + gdb_test_no_output "set breakpoint always-inserted on" + + set test "set dprintf" + gdb_test_multiple "dprintf $dp_location, \"y=%d\\n\", y" $test { + -re "cannot run dprintf commands.*$gdb_prompt $" { + unsupported $test + } + -re "Dprintf .* at .*$gdb_prompt $" { + pass $test + } + } + + # In case of agent style, this should force the target to + # report the trap to GDB. IOW, GDB should remove the commands + # from the target-side breakpoint. + gdb_test "break $dp_location" ".*" "set breakpoint" + + gdb_test "continue" "set dprintf here.*" + } +} + +test "gdb" +test "agent" |