sss-bp-on-user-bp-2.exp sometimes fails on native GNU/Linux.
authorPedro Alves <palves@redhat.com>
Fri, 6 Jun 2014 18:59:21 +0000 (19:59 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 6 Jun 2014 18:59:21 +0000 (19:59 +0100)
I noticed that sss-bp-on-user-bp-2.exp is racy on native GNU/Linux.  I
sometimes still see an int3 in the disassembly:

 (gdb) PASS: gdb.base/sss-bp-on-user-bp-2.exp: set debug target 0
 disassemble test
 Dump of assembler code for function test:
    0x0000000000400590 <+0>:     push   %rbp
    0x0000000000400591 <+1>:     mov    %rsp,%rbp
    0x0000000000400594 <+4>:     nop
 => 0x0000000000400595 <+5>:     int3
    0x0000000000400596 <+6>:     pop    %rbp
    0x0000000000400597 <+7>:     retq
 End of assembler dump.
 (gdb) FAIL: gdb.base/sss-bp-on-user-bp-2.exp: before/after disassembly matches

Enabling infrun/target debug logs, we can see the problem.
Simplified, that's:

 (gdb) PASS: gdb.base/sss-bp-on-user-bp-2.exp: define stepi_del_break
 stepi_del_break
 infrun: clear_proceed_status_thread (process 25311)
 infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [process 25311] at 0x400594
 LLR: PTRACE_SINGLESTEP process 25311, 0 (resume event thread)
 target_resume (25311, step, 0)
 native:target_xfer_partial (3, (null), 0x0, 0x32dce4c, 0x400595, 1) = 0, 0
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 (gdb) linux_nat_wait: [process -1], [TARGET_WNOHANG]

0x400595 is the address of the breakpoint, and "= 0" is
TARGET_XFER_EOF.  That's default_memory_remove_breakpoint trying to
remove the breakpoint, but failing.

The problem is that we had just resumed the target and the native
GNU/Linux target can't read memory off of a running thread.  Most of
the time, we get "lucky", because we manage to read memory before the
kernel actually schedules the target to run.

So just give up and skip the test on any target that uses hardware
stepping, not just remote targets.

gdb/testsuite/
2014-06-06  Pedro Alves  <palves@redhat.com>

* gdb.base/sss-bp-on-user-bp-2.exp: Look for target_resume(step)
in target debug output instead of looking at RSP packets,
disabling the test on any target that uses hardware stepping.
Update comments.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/sss-bp-on-user-bp-2.exp

index 933df0a1f2c118a399b03328fe9d8936cdb0cd33..327e648cc9b905c817b57bcbd53dfb940bce914b 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-06  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/sss-bp-on-user-bp-2.exp: Look for target_resume(step)
+       in target debug output instead of looking at RSP packets,
+       disabling the test on any target that uses hardware stepping.
+       Update comments.
+
 2014-06-06  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/break-unload-file.exp: Fix typo.
index 87fa5f81be568d293517ff3add8e508588e6c1c1..a196f68ee5ce23b0c445c136c6cd5b1c595de190 100644 (file)
@@ -50,23 +50,20 @@ delete_breakpoints
 # delete the user breakpoint from the target, which will fail, with
 # "Cannot execute this command while the target is running.".  On
 # software single-step targets, that del shouldn't trigger any RSP
-# traffic.  Just skip the test if testing against a remove target and
-# not using software single-stepping.  IOW, skip the test if we see a
-# 'vCont;s' or 's' in the RSP traffic.
-
-gdb_test_no_output "set debug remote 1"
-
-set rsp_hardware_step 0
+# traffic.  Hardware-step targets that can't access memory while the
+# target is running, either remote or native, are likewise affected.
+# So we just skip the test if not using software single-stepping.  We
+# detect that by looking for 'target_resume (..., step)' in "debug
+# target" output.
 
 # Probe for software single-step breakpoint use.
-set test "probe RSP hardware step"
+
+gdb_test_no_output "set debug target 1"
+set hardware_step 0
+set test "probe target hardware step"
 gdb_test_multiple "si" $test {
-    -re "\\\$vCont;s.*$gdb_prompt $" {
-       set rsp_hardware_step 1
-       pass $test
-    }
-    -re "\\\$s#.*$gdb_prompt $" {
-       set rsp_hardware_step 1
+    -re "target_resume \\(\[^\r\n\]+, step, .*$gdb_prompt $" {
+       set hardware_step 1
        pass $test
     }
     -re "$gdb_prompt $" {
@@ -74,12 +71,12 @@ gdb_test_multiple "si" $test {
     }
 }
 
-if { $rsp_hardware_step } {
-    unsupported "remote target doesn't use software single-stepping"
+if { $hardware_step } {
+    unsupported "target doesn't use software single-stepping"
     return
 }
 
-gdb_test_no_output "set debug remote 0"
+gdb_test_no_output "set debug target 0"
 
 set line_re "\[^\r\n\]*"
 
This page took 0.029906 seconds and 4 git commands to generate.