This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA/7.8] user breakpoint not inserted if software-single-step at same location
- From: Yao Qi <yao at codesourcery dot com>
- To: Pedro Alves <palves at redhat dot com>, Andreas Schwab <schwab at suse dot de>
- Cc: Joel Brobecker <brobecker at adacore dot com>, <gdb-patches at sourceware dot org>
- Date: Wed, 4 Jun 2014 13:12:45 +0800
- Subject: Re: [RFA/7.8] user breakpoint not inserted if software-single-step at same location
- Authentication-results: sourceware.org; auth=none
- References: <1401394280-14999-1-git-send-email-brobecker at adacore dot com> <5387BFF0 dot 6010208 at redhat dot com> <20140530122253 dot GC4289 at adacore dot com> <53887ED5 dot 5050603 at redhat dot com> <20140530132659 dot GD4289 at adacore dot com> <5388AA76 dot 4070101 at redhat dot com> <538DB721 dot 30308 at codesourcery dot com> <538DB8EC dot 20109 at redhat dot com> <mvmtx82dwf6 dot fsf at hawking dot suse dot de> <538DBD65 dot 5050409 at redhat dot com>
On 06/03/2014 08:19 PM, Pedro Alves wrote:
> On 06/03/2014 01:12 PM, Andreas Schwab wrote:
>> Pedro Alves <palves@redhat.com> writes:
>>
>>> Ah, thanks. We need to replace then with asm("nop") then.
>>
>> nop isn't portable.
>
> Yes, but it doesn't matter what the instruction is as
> long as it's a single instruction that doesn't do much.
> For archs that don't have "nop" (like e.g., IA64), we can
> just use #ifdef to pick another insn.
>
Pedro, here is the patch to tweak sss-bp-on-user-bp.exp.
I give up on looking for a portable "nop" for various arch. In
stead, we can use disassemble to get the next instruction address
and set breakpoint there. See details in the commit log below.
--
Yao (éå)
Subject: [PATCH] Tweak sss-bp-on-user-bp.exp
sss-bp-on-user-bp.c has an assumption that write to integer can be
compiled to a single instruction, which isn't true on some arch, such
as arm. This test requires setting two breakpoints on two consecutive
instructions, so this patch is to get the address of the next
instruction via disassemble and set the 2nd breakpoint there. This
approach is portable.
This patch fixes the fails in sss-bp-on-user-bp.exp on arm-none-abi
target. There is no change in x86 test results. I also revert the
patch to PR breakpoints/17000, and verified that the patched
sss-bp-on-user-bp.exp still triggers the fail on
x86-with-software-single-step.
gdb/testsuite:
2014-06-04 Yao Qi <yao@codesourcery.com>
* gdb.base/sss-bp-on-user-bp.c (main): Remove comments.
* gdb.base/sss-bp-on-user-bp.exp: Don't set breakpoint on
"set bar break here". Get the next instruction address and
set breakpoint there. Remove "bar break" from the regexp
patterns.
---
gdb/testsuite/gdb.base/sss-bp-on-user-bp.c | 4 ++--
gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp | 20 +++++++++++++++++---
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
index ff82051..edc2e8c 100644
--- a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
+++ b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
@@ -21,10 +21,10 @@
int
main (void)
{
- /* Assume writes to integers compile to a single instruction. */
volatile int i = 0;
i = 1; /* set foo break here */
- i = 2; /* set bar break here */
+ i = 2;
+
return 0;
}
diff --git a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
index 2a12ad6..0b39fc1 100644
--- a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
+++ b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
@@ -32,7 +32,21 @@ if ![runto_main] then {
gdb_breakpoint [gdb_get_line_number "set foo break here"]
gdb_continue_to_breakpoint "first breakpoint" ".* set foo break here .*"
-gdb_breakpoint [gdb_get_line_number "set bar break here"]
+# Get the address of the next instruction and set a breakpoint there.
+set next_insn_addr ""
+set test "disassemble main"
+gdb_test_multiple $test $test {
+ -re ".*=> $hex <\\+$decimal>:\[^\r\n\]+\r\n ($hex) .*$gdb_prompt $" {
+ set next_insn_addr $expect_out(1,string)
+ pass $test
+ }
+}
+
+if { $next_insn_addr == "" } {
+ return -1
+}
+
+gdb_test "b *$next_insn_addr" "Breakpoint .*"
# So that GDB doesn't try to remove the regular breakpoint when the
# step finishes.
@@ -43,9 +57,9 @@ gdb_test_no_output "set breakpoint always-inserted on"
# remove it. But, a regular breakpoint is planted there already, and
# with always-inserted on, should remain planted when the step
# finishes.
-gdb_test "si" "Breakpoint .* bar break .*"
+gdb_test "si" "Breakpoint .*"
# If the breakpoint is still correctly inserted, then this jump should
# re-trigger it. Otherwise, GDB will lose control and the program
# will exit. See PR breakpoints/17000.
-gdb_test "jump *\$pc" "Breakpoint .* bar break .*"
+gdb_test "jump *\$pc" "Breakpoint .*"
--
1.9.0