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  <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.

gdb/testsuite/
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.
This commit is contained in:
Pedro Alves
2014-06-02 22:27:33 +01:00
parent cd1608cc4e
commit 41fac0cf49
5 changed files with 121 additions and 5 deletions

View File

@ -1,3 +1,8 @@
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> 2014-06-02 Pedro Alves <palves@redhat.com>
* breakpoint.c (dprintf_breakpoint_hit): New function. * breakpoint.c (dprintf_breakpoint_hit): New function.

View File

@ -2351,14 +2351,26 @@ build_target_command_list (struct bp_location *bl)
/* Release commands left over from a previous insert. */ /* Release commands left over from a previous insert. */
VEC_free (agent_expr_p, bl->target_info.tcommands); 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)
return;
if (!target_can_run_breakpoint_commands ()) if (!target_can_run_breakpoint_commands ())
return; return;
/* 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 /* Do a first pass to check for locations with no assigned
conditions or conditions that fail to parse to a valid agent expression 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 bytecode. If any of these happen, then it's no use to send conditions

View File

@ -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> 2014-06-02 Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
* gdb.arch/powerpc-power.exp: Add power8 instructions to the testcase. * gdb.arch/powerpc-power.exp: Add power8 instructions to the testcase.

View File

@ -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;
}

View File

@ -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"