Fix PR breakpoints/16101: gdb.base/dprintf.exp agent-printf failures with non-Z0...
authorHui Zhu <hui@codesourcery.com>
Mon, 24 Mar 2014 19:30:50 +0000 (19:30 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 24 Mar 2014 19:30:50 +0000 (19:30 +0000)
After a previous patch that was committed by Pedro (0000e5cc), trying
to set a dprintf with with a GDBserver that doesn't support agent
commands at all now throws an error.  But the dprintf tests still fail
with some GDBserver targets because they doesn't try to handle the
case of the server reporting support for breakpoint commands, but not
be able to use those in combination with Z0 (because Z0 isn't actually
supported, for example):

 FAIL: gdb.base/dprintf.exp: 1st dprintf, agent
 FAIL: gdb.base/dprintf.exp: 2nd dprintf, agent
 FAIL: gdb.base/dprintf.exp: dprintf info 2 (pattern 4)

Similarly for the MI test.

This patch makes the tests handle this scenario.

Tested with native, and native gdbserver on x86_64 Fedora 17.

Also tested with the native-gdbserver.exp board hacked with:

 set GDBFLAGS "${GDBFLAGS} -ex \"set remote breakpoint-commands off\""

(actually, "set remote breakpoint-commands off" is presently broken,
so this was on top of a fix for that command.)

which results in:
 (gdb) PASS: gdb.base/dprintf.exp: 2nd dprintf, gdb
 set dprintf-style agent
 warning: Target cannot run dprintf commands, falling back to GDB printf
 warning: Target cannot run dprintf commands, falling back to GDB printf
 (gdb) UNSUPPORTED: gdb.base/dprintf.exp: set dprintf style to agent

gdb.sum:
 Running target native-gdbserver
 Running ../../../src/gdb/testsuite/gdb.base/dprintf.exp ...
 PASS: gdb.base/dprintf.exp: dprintf
 PASS: gdb.base/dprintf.exp: dprintf foo
 PASS: gdb.base/dprintf.exp: dprintf 29
 PASS: gdb.base/dprintf.exp: dprintf foo,"At foo entry\n"
 PASS: gdb.base/dprintf.exp: ignore $bpnum 1
 PASS: gdb.base/dprintf.exp: dprintf 26,"arg=%d, g=%d\n", arg, g
 PASS: gdb.base/dprintf.exp: dprintf info 1
 PASS: gdb.base/dprintf.exp: break 27
 PASS: gdb.base/dprintf.exp: 1st dprintf, gdb
 PASS: gdb.base/dprintf.exp: 2nd dprintf, gdb
 UNSUPPORTED: gdb.base/dprintf.exp: set dprintf style to agent
 PASS: gdb.base/dprintf.exp: Set dprintf style to an unrecognized type

And also with the native-gdbserver.exp board hacked with:

 set GDBFLAGS "${GDBFLAGS} -ex \"set remote Z-packet off\""

which results in:
 (gdb) continue
 Continuing.
 Warning:
 Cannot insert breakpoint 3: Target doesn't support breakpoints that have target side commands.
 Cannot insert breakpoint 4: Target doesn't support breakpoints that have target side commands.

 (gdb) UNSUPPORTED: gdb.base/dprintf.exp: 1st dprintf, agent

gdb.sum:
 Running target native-gdbserver
 Running ../../../src/gdb/testsuite/gdb.base/dprintf.exp ...
 PASS: gdb.base/dprintf.exp: dprintf
 PASS: gdb.base/dprintf.exp: dprintf foo
 PASS: gdb.base/dprintf.exp: dprintf 29
 PASS: gdb.base/dprintf.exp: dprintf foo,"At foo entry\n"
 PASS: gdb.base/dprintf.exp: ignore $bpnum 1
 PASS: gdb.base/dprintf.exp: dprintf 26,"arg=%d, g=%d\n", arg, g
 PASS: gdb.base/dprintf.exp: dprintf info 1
 PASS: gdb.base/dprintf.exp: break 27
 PASS: gdb.base/dprintf.exp: 1st dprintf, gdb
 PASS: gdb.base/dprintf.exp: 2nd dprintf, gdb
 PASS: gdb.base/dprintf.exp: set dprintf style to agent
 UNSUPPORTED: gdb.base/dprintf.exp: 1st dprintf, agent
 PASS: gdb.base/dprintf.exp: Set dprintf style to an unrecognized type

(One of the new comments mentions breakpoint always-inserted mode.
Actually testing with breakpoint always-inserted mode fails these
dprintf tests, due to the way they are written.  But that'll take a
more substancial rewrite of the tests, so I'm leaving that for another
day.)

gdb/testsuite/
2014-03-24  Hui Zhu  <hui@codesourcery.com>
    Pedro Alves  <palves@redhat.com>

PR breakpoints/16101
* gdb.base/dprintf.exp: Use unsupported rather than changing the
test pass/fail messages.  Detect missing support for dprintf when
breakpoints are actually inserted.
* gdb.base/mi-dprintf.exp: Detect missing support for dprintf when
breakpoints are actually inserted.
* lib/mi-support.exp (mi_run_cmd_full): Return -1 if continue
fails.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/dprintf.exp
gdb/testsuite/gdb.mi/mi-dprintf.exp
gdb/testsuite/lib/mi-support.exp

index 88ba2a322d6ef0c43920d85e3ae2e283a3f9bac8..9b5ce14c5971f0ff27c48d45cb6f85be12967d35 100644 (file)
@@ -1,3 +1,15 @@
+2014-03-24  Hui Zhu  <hui@codesourcery.com>
+           Pedro Alves  <palves@redhat.com>
+
+       PR breakpoints/16101
+       * gdb.base/dprintf.exp: Use unsupported rather than changing the
+       test pass/fail messages.  Detect missing support for dprintf when
+       breakpoints are actually inserted.
+       * gdb.base/mi-dprintf.exp: Detect missing support for dprintf when
+       breakpoints are actually inserted.
+       * lib/mi-support.exp (mi_run_cmd_full): Return -1 if continue
+       fails.
+
 2014-03-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.base/gdb-sigterm.exp (do_test): Remove "set debug lin-lwp 1".
index cb21d2edead54986cacd8b5e60850fd9628de571..a040580108050379a83a4978c65abab2744cc78b 100644 (file)
@@ -96,15 +96,20 @@ if ![target_info exists gdb,noinferiorio] {
        "2nd dprintf, fprintf"
 }
 
+# Now test the "agent" style.
+
 set target_can_dprintf 1
-set msg "Set dprintf style to agent"
+set msg "set dprintf style to agent"
 gdb_test_multiple "set dprintf-style agent" $msg {
     -re "warning: Target cannot run dprintf commands.*\r\n$gdb_prompt $" {
+
+       # The target reports that it doesn't support target side
+       # commands at all.
        set target_can_dprintf 0
-       pass "$msg - cannot do"
+       unsupported "$msg"
     }
     -re ".*$gdb_prompt $" {
-       pass "$msg - can do"
+       pass "$msg"
     }
 }
 
@@ -113,20 +118,36 @@ if $target_can_dprintf {
 
     gdb_test "" "Breakpoint"
 
-    gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "1st dprintf, agent"
-
-    gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "2nd dprintf, agent"
+    # Even if the the target reports that it does support target side
+    # commands, we can only tell that it supports them in combination
+    # with a particular breakpoint type (Z0, Z1, etc.) when we try to
+    # insert the breakpoint.  When "set breakpoint always-inserted is
+    # off", that'll be on next continue.
+    set msg "1st dprintf, agent"
+    gdb_test_multiple "continue" $msg {
+       -re "Warning:.*Target doesn't support breakpoints that have target side commands.*\r\n$gdb_prompt $" {
+           set target_can_dprintf 0
+           unsupported "$msg"
+       }
+       -re "Breakpoint \[0-9\]+, foo .*$gdb_prompt $" {
+           pass "$msg"
+       }
+    }
 
-    gdb_test_sequence "info breakpoints" "dprintf info 2" {
-       "\[\r\n\]Num     Type           Disp Enb Address +What"
-       "\[\r\n\]2       breakpoint"
-       "\[\r\n\]\tbreakpoint already hit 2 times"
-       "\[\r\n\]3       dprintf"
-       "\[\r\n\]\tbreakpoint already hit 2 times"
-       "\[\r\n\]        agent-printf \"At foo entry\\\\n\""
-       "\[\r\n\]4       dprintf"
-       "\[\r\n\]\tbreakpoint already hit 2 times"
-       "\[\r\n\]        agent-printf \"arg=%d, g=%d\\\\n\", arg, g"
+    if $target_can_dprintf {
+       gdb_test "continue" "Breakpoint \[0-9\]+, foo .*" "2nd dprintf, agent"
+
+       gdb_test_sequence "info breakpoints" "dprintf info 2" {
+           "\[\r\n\]Num     Type           Disp Enb Address +What"
+           "\[\r\n\]2       breakpoint"
+           "\[\r\n\]\tbreakpoint already hit 2 times"
+           "\[\r\n\]3       dprintf"
+           "\[\r\n\]\tbreakpoint already hit 2 times"
+           "\[\r\n\]        agent-printf \"At foo entry\\\\n\""
+           "\[\r\n\]4       dprintf"
+           "\[\r\n\]\tbreakpoint already hit 2 times"
+           "\[\r\n\]        agent-printf \"arg=%d, g=%d\\\\n\", arg, g"
+       }
     }
 }
 
index af334cf2d7b36e38ca2da88957bbdfe51885dae3..983acce2e351ff9001820bcc1c82a20543b79b95 100644 (file)
@@ -140,30 +140,39 @@ gdb_expect {
 }
 
 if $target_can_dprintf {
-    mi_run_cmd
+    if {[mi_run_cmd] < 0} {
+       # This likely means we failed to use target side commands in
+       # combination with software breakpoints.  IOW, the target
+       # likely doesn't support target-side software breakpoints.
+       set target_can_dprintf 0
+       unsupported "send dprintf to target"
+    }
 
-    mi_expect_stop ".*" ".*" ".*" ".*" ".*" "" "mi expect stop"
+    if $target_can_dprintf {
+       mi_expect_stop ".*" ".*" ".*" ".*" ".*" "" "mi expect stop"
 
-    mi_send_resuming_command "exec-continue" "mi 1st dprintf continue, agent"
-    mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 1st dprintf, agent"
+       mi_send_resuming_command "exec-continue" "mi 1st dprintf continue, agent"
+       mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 1st dprintf, agent"
 
-    mi_send_resuming_command "exec-continue" "mi 2nd dprintf continue, agent"
+       mi_send_resuming_command "exec-continue" "mi 2nd dprintf continue, agent"
 
-    # The =breakpoint-modified text is a part of the "-exec-continue" output.
-    set msg "mi info dprintf second time"
-    gdb_expect {
-       -re "=breakpoint-modified," {
-           pass $msg
-       }
-       -re ".*$mi_gdb_prompt$" {
-           fail "$msg"
-       }
-       timeout {
-           fail "$msg"
+       # The =breakpoint-modified text is a part of the
+       # "-exec-continue" output.
+       set msg "mi info dprintf second time"
+       gdb_expect {
+           -re "=breakpoint-modified," {
+               pass $msg
+           }
+           -re ".*$mi_gdb_prompt$" {
+               fail "$msg"
+           }
+           timeout {
+               fail "$msg"
+           }
        }
-    }
 
-    mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 2nd dprintf, agent"
+       mi_expect_stop ".*" "foo" ".*" ".*" ".*" "" "mi 2nd dprintf, agent"
+    }
 }
 
 mi_gdb_test "set dprintf-style foobar" ".*error.*" "mi set dprintf style to an unrecognized type"
index 213073acba9ad4e9559d975f8c972026483d65b7..7c234c010b29b29a824b93e6a2d086281f7a0bb4 100644 (file)
@@ -843,6 +843,7 @@ proc mi_run_cmd_full {use_mi_command args} {
            send_gdb "${run_prefix}continue\n"
            gdb_expect 60 {
                -re "${run_match}\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"\]+\"\r\n$mi_gdb_prompt" {}
+               -re "${run_match}\\^error.*$mi_gdb_prompt" {return -1}
                default {}
            }
            return 0