From: Pedro Alves Date: Mon, 2 Jun 2014 21:27:33 +0000 (+0100) Subject: Installing a breakpoint on top of a dprintf makes GDB lose control. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=41fac0cf495b84994046901e3293d54e8eef3534;p=binutils-gdb.git Installing a breakpoint on top of a dprintf makes GDB lose control. While the full fix for PR 15180 isn't in, it's best if we at least make sure that GDB doesn't lose control when a breakpoint is set at the same address as a dprintf. gdb/ 2014-06-02 Pedro Alves * breakpoint.c (build_target_command_list): Don't build a command list if we have any duplicate location that isn't a dprintf. gdb/testsuite/ 2014-06-02 Pedro Alves * gdb.base/dprintf-bp-same-addr.c: New file. * gdb.base/dprintf-bp-same-addr.exp: New file. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1d37c567ddf..d8f1cbe168f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2014-06-02 Pedro Alves + + * 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 * breakpoint.c (dprintf_breakpoint_hit): New function. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index a966ba2bee1..4e6c627d913 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 eed85c1e676..f4d59cf78c3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-06-02 Pedro Alves + + * gdb.base/dprintf-bp-same-addr.c: New file. + * gdb.base/dprintf-bp-same-addr.exp: New file. + 2014-06-02 Edjunior Barbosa Machado * 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 00000000000..b28e1020cdf --- /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 . */ + +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 00000000000..b0c6d7b40d2 --- /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 . + +# 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"