This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Enable non-stop mode MI tests against remote targets.


On Thursday 26 March 2009 00:54:52, Pedro Alves wrote:
> With this patch, the MI non-stop mode tests pass cleanly against
> gdbserver once the gdbserver non-stop mode patch is applied:
> 
>  http://sourceware.org/ml/gdb-patches/2009-03/msg00582.html
> 
> The tests currently assume a native GDB.  They use -exec-run
> directly.  I've changed them to use mi_run_to_main, which
> works nicelly.  To make the tests fails fail gracefully when
> the remote side doesn't support non-stop mode, I've made
> mi_run_to_main and its callees propagate an error return up,
> similarly to CLI's runto_main.  This means that this patch can go
> in before the gdbserver bits go in.  Most other MI tests could be
> adjusted to do the same "if { [mi_run_to_main] < 0 } { BAIL }"
> check, which avoids cascasted FAILs and timeouts.
> 
> Vladimir, do you think this looks OK?
> 

Huh!  I was so focused on remote targets, that I forgot to
make native targets still fail gracefully if non-stop is
not supported.

This updated patch adds this bit on top of the previous one.

@@ -827,6 +827,10 @@ proc mi_run_cmd {args} {
     gdb_expect {
        -re "220\\^running\r\n(\\*running,thread-id=\"\[^\"\]+\"\r\n|=thread-created,id=\"1\",group-id=\"\[0-9\]+\"\r\n)*(${library_loaded_re})*(${thread_selected_re})?${mi_gdb_prompt}" {
        }
+       -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
+           unsupported "Non-stop mode not supported"
+           return -1
+       }
        timeout {
            perror "Unable to start target"
            return -1


-- 
Pedro Alves

2009-03-26  Pedro Alves  <pedro@codesourcery.com>

	* gdb.mi/mi-nonstop.exp: Don't check isnative.  Use
	mi_run_to_main.  Skip thread exit test on remote targets.
	* gdb.mi/mi-nsintrall.exp: Don't check isnative.  Use
	mi_run_to_main.
	* gdb.mi/mi-nsmoribund.exp: Don't check isnative.  Use
	mi_run_to_main.
	* lib/mi-support.exp (mi_gdb_target_cmd): Remove trailing anchor
	when expecting ^connected.  Detect when the target doesn't support
	non-stop mode.
	(mi_run_cmd): Detect if non-stop mode was requested by isn't
	supported.  Return -1 on error, 0 on success.
	(mi_runto_helper): Don't expect a stop if mi_run_cmd failed.
	(mi_runto): Return mi_runto_helper's result explicitly.

---
 gdb/testsuite/gdb.mi/mi-nonstop.exp    |   73 +++++++++++----------------------
 gdb/testsuite/gdb.mi/mi-nsintrall.exp  |   36 +---------------
 gdb/testsuite/gdb.mi/mi-nsmoribund.exp |   36 +---------------
 gdb/testsuite/lib/mi-support.exp       |   28 +++++++++---
 4 files changed, 51 insertions(+), 122 deletions(-)

Index: src/gdb/testsuite/gdb.mi/mi-nonstop.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.mi/mi-nonstop.exp	2009-03-26 01:15:13.000000000 +0000
+++ src/gdb/testsuite/gdb.mi/mi-nonstop.exp	2009-03-26 02:18:13.000000000 +0000
@@ -14,11 +14,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# This only works with native configurations
-if {![isnative]} {
-  return
-}
-
 load_lib mi-support.exp
 set MIFLAGS "-i=mi"
 
@@ -46,9 +41,9 @@ set supported 0
 send_gdb "-gdb-show non-stop\n"
 gdb_expect {
     -re ".*\\^done,value=\"off\",supported=\"(\[^\"\]+)\"\r\n$mi_gdb_prompt$" {
-        if { $expect_out(1,string) == "1" } {
-            set supported 1
-        }
+	if { $expect_out(1,string) == "1" } {
+	    set supported 1
+	}
     }
     -re ".$mi_gdb_prompt$" {
     }
@@ -58,34 +53,10 @@ mi_gdb_test "-gdb-set non-stop 1" ".*"
 mi_gdb_test "-gdb-set target-async 1" ".*"
 detect_async
 
-mi_gdb_test "200-break-insert -t main" ".*"
-
-set created "=thread-created,id=\"$decimal\"\r\n"
-set running "\\*running,thread-id=\"$decimal\"\r\n"
-
-set notifs "($created)*($running)*($library_loaded_re)*"
-
-# Note: presently, we skip this test on non-native targets,
-# so 'run' is OK.  As soon as we start to run this on remote
-# target, the logic from mi_run_cmd will have to be refactored.
-send_gdb "-exec-run\n"
-gdb_expect {
-    -re "\\^running\r\n$notifs$mi_gdb_prompt" {
-    }
-    -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
-        verbose -log "Non-stop mode not supported, skipping all tests"
-        return
-    }
-    -re "\r\n$mi_gdb_prompt" {
-        perror "Cannot start target (unknown output after running)"
-        return -1
-    }
-    timeout {
-        perror "Cannot start target (timeout)"
-        return -1
-    }
+if { [mi_run_to_main] < 0 } {
+    perror "mi-nonstop.exp tests suppressed"
+    continue
 }
-mi_expect_stop "breakpoint-hit" main ".*" ".*" "\[0-9\]+" { "" "disp=\"del\"" } "run to main"
 
 mi_create_breakpoint break_at_me 2 keep break_at_me .* .* .* "breakpoint at marker"
 
@@ -114,13 +85,13 @@ mi_varobj_update * {I_W1 I_W0} "update v
 mi_check_varobj_value I_W0 1 "check varobj, w0, 1"
 mi_check_varobj_value I_W1 1 "check varobj, w1, 1"
 
-send_gdb "-exec-interrupt --thread 1\n" 
+send_gdb "-exec-interrupt --thread 1\n"
 gdb_expect {
     -re "\\^done\r\n$mi_gdb_prompt\\*stopped\[^\r\n\]+\r\n$" {
-        pass "interrupted"
+	pass "interrupted"
     }
     timeout {
-        fail "interrupted (timeout)"
+	fail "interrupted (timeout)"
     }
 }
 # The interrupt command sends SIGINT to the target, and therefore the
@@ -132,10 +103,10 @@ mi_check_thread_states {"stopped" "stopp
 send_gdb "-exec-continue --all\n"
 gdb_expect {
     -re ".*\\*running,thread-id=\"3\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"1\"\r\n$mi_gdb_prompt" {
-        pass "resume all"
+	pass "resume all"
     }
     timeout {
-        fail "resume all (timeout)"
+	fail "resume all (timeout)"
     }
 }
 
@@ -172,12 +143,20 @@ mi_gdb_test "-stack-list-frames --thread
 mi_gdb_test "-thread-select 2" "\\^done.*" "select first worker thread"
 # Since thread 2 is running, we need to set variable via another thread.
 mi_gdb_test "-gdb-set --thread 3 variable exit_first_thread=1" ".*\\^done" "ask the second thread to exit"
-gdb_expect {
-    -re ".*=thread-exited,id=\"2\",group-id=\"\[0-9\]+\"\r\n$" {
-        pass "wait for thread exit"
-    }
-    timeout {
-        fail "wait for thread exit (timeout)"
+
+set test "wait for thread exit"
+if { [is_remote target] } {
+    # The remote protocol doesn't have support for thread exit
+    # notifications.
+    unsupported $test
+} else {
+    gdb_expect {
+	-re ".*=thread-exited,id=\"2\",group-id=\"\[0-9\]+\"\r\n$" {
+	    pass $test
+	}
+	timeout {
+	    fail "$test (timeout)"
+	}
     }
 }
 
@@ -186,6 +165,4 @@ mi_gdb_test "-stack-list-frames --thread
     "\\^done,stack=\\\[frame={level=\"0\",addr=\".*\",func=\"break_at_me\".*" \
     "stacktrace of stopped thread"
 
-    
 mi_gdb_exit
-
Index: src/gdb/testsuite/gdb.mi/mi-nsintrall.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.mi/mi-nsintrall.exp	2009-03-26 01:15:13.000000000 +0000
+++ src/gdb/testsuite/gdb.mi/mi-nsintrall.exp	2009-03-26 02:18:13.000000000 +0000
@@ -13,11 +13,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# This only works with native configurations
-if {![isnative]} {
-  return
-}
-
 load_lib mi-support.exp
 set MIFLAGS "-i=mi"
 
@@ -57,35 +52,10 @@ mi_gdb_test "-gdb-set non-stop 1" ".*"
 mi_gdb_test "-gdb-set target-async 1" ".*"
 detect_async
 
-mi_gdb_test "200-break-insert -t main" ".*"
-
-set created "=thread-created,id=\"$decimal\"\r\n"
-set running "\\*running,thread-id=\"$decimal\"\r\n"
-
-set notifs "($created)*($running)*($library_loaded_re)*"
-
-# Note: presently, we skip this test on non-native targets,
-# so 'run' is OK.  As soon as we start to run this on remote
-# target, the logic from mi_run_cmd will have to be refactored.
-send_gdb "-exec-run\n"
-gdb_expect {
-    -re "\\^running\r\n$notifs$mi_gdb_prompt" {
-    }
-    -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
-	verbose -log "Non-stop mode not supported, skipping all tests"
-	return
-    }
-    -re "\r\n$mi_gdb_prompt" {
-	perror "Cannot start target (unknown output after running)"
-	return -1
-    }
-    timeout {
-	perror "Cannot start target (timeout)"
-	return -1
-    }
+if { [mi_run_to_main] < 0 } {
+    perror "mi-nsintrall.exp tests suppressed"
+    continue
 }
-mi_expect_stop "breakpoint-hit" main ".*" ".*" "\[0-9\]+" \
-    { "" "disp=\"del\"" } "run to main"
 
 mi_create_breakpoint thread_function 2 keep thread_function .* .* .* \
     "breakpoint at thread_function"
Index: src/gdb/testsuite/gdb.mi/mi-nsmoribund.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.mi/mi-nsmoribund.exp	2009-03-26 01:15:13.000000000 +0000
+++ src/gdb/testsuite/gdb.mi/mi-nsmoribund.exp	2009-03-26 02:18:13.000000000 +0000
@@ -13,11 +13,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# This only works with native configurations
-if {![isnative]} {
-  return
-}
-
 load_lib mi-support.exp
 set MIFLAGS "-i=mi"
 
@@ -57,35 +52,10 @@ mi_gdb_test "-gdb-set non-stop 1" ".*"
 mi_gdb_test "-gdb-set target-async 1" ".*"
 detect_async
 
-mi_gdb_test "200-break-insert -t main" ".*"
-
-set created "=thread-created,id=\"$decimal\"\r\n"
-set running "\\*running,thread-id=\"$decimal\"\r\n"
-
-set notifs "($created)*($running)*($library_loaded_re)*"
-
-# Note: presently, we skip this test on non-native targets,
-# so 'run' is OK.  As soon as we start to run this on remote
-# target, the logic from mi_run_cmd will have to be refactored.
-send_gdb "-exec-run\n"
-gdb_expect {
-    -re "\\^running\r\n$notifs$mi_gdb_prompt" {
-    }
-    -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
-	verbose -log "Non-stop mode not supported, skipping all tests"
-	return
-    }
-    -re "\r\n$mi_gdb_prompt" {
-	perror "Cannot start target (unknown output after running)"
-	return -1
-    }
-    timeout {
-	perror "Cannot start target (timeout)"
-	return -1
-    }
+if { [mi_run_to_main] < 0 } {
+    perror "mi-nsmoribund.exp tests suppressed"
+    continue
 }
-mi_expect_stop "breakpoint-hit" main ".*" ".*" "\[0-9\]+" \
-    { "" "disp=\"del\"" } "run to main"
 
 # Keep this in sync with THREADS in the the $srcfile.
 set nthreads 10
Index: src/gdb/testsuite/lib/mi-support.exp
===================================================================
--- src.orig/gdb/testsuite/lib/mi-support.exp	2009-03-26 01:15:13.000000000 +0000
+++ src/gdb/testsuite/lib/mi-support.exp	2009-03-26 02:25:20.000000000 +0000
@@ -333,7 +333,7 @@ proc mi_gdb_target_cmd { targetname seri
     for {set i 1} {$i <= 3} {incr i} {
 	send_gdb "47-target-select $targetname $serialport\n"
 	gdb_expect 60 {
-	    -re "47\\^connected.*$mi_gdb_prompt$" {
+	    -re "47\\^connected.*$mi_gdb_prompt" {
 		verbose "Set target to $targetname";
 		return 0;
 	    }
@@ -365,6 +365,10 @@ proc mi_gdb_target_cmd { targetname seri
 		sleep 5
 		continue
 	    }
+	    -re "Non-stop mode requested, but remote does not support non-stop.*$mi_gdb_prompt" {
+		unsupported "Non-stop mode not supported"
+		return 1
+	    }
 	    -re "Timeout reading from remote system.*$mi_gdb_prompt$" {
 		verbose "Got timeout error from gdb.";
 	    }
@@ -787,13 +791,13 @@ proc mi_run_cmd {args} {
 	    -re "$mi_gdb_prompt$" { }
 	    default {
 		perror "gdb_init_command for target failed";
-		return;
+		return -1;
 	    }
 	}
     }
 
     if { [mi_gdb_target_load] < 0 } {
-	return
+	return -1
     }
 
     if [target_info exists use_gdb_stub] {
@@ -803,7 +807,7 @@ proc mi_run_cmd {args} {
 		-re "220\\^running\[\r\n\]+\\*running,thread-id=\"\[^\"\]+\"\r\n$mi_gdb_prompt" {}
 		default {}
 	    }
-	    return;
+	    return 0;
 	}
 
 	if [target_info exists gdb,start_symbol] {
@@ -816,19 +820,25 @@ proc mi_run_cmd {args} {
 	# to better handle RUN.
 	send_gdb  "jump *$start\n"
 	warning "Using CLI jump command, expect run-to-main FAIL"
-	return
+	return 0
     }
 
     send_gdb "220-exec-run $args\n"
     gdb_expect {
 	-re "220\\^running\r\n(\\*running,thread-id=\"\[^\"\]+\"\r\n|=thread-created,id=\"1\",group-id=\"\[0-9\]+\"\r\n)*(${library_loaded_re})*(${thread_selected_re})?${mi_gdb_prompt}" {
 	}
+	-re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
+	    unsupported "Non-stop mode not supported"
+	    return -1
+	}
 	timeout {
 	    perror "Unable to start target"
-	    return
+	    return -1
 	}
     }
     # NOTE: Shortly after this there will be a ``000*stopped,...(gdb)''
+
+    return 0
 }
 
 #
@@ -884,7 +894,9 @@ proc mi_runto_helper {func run_or_contin
   }
 
   if {$run_or_continue == "run"} {
-      mi_run_cmd
+      if { [mi_run_cmd] < 0 } {
+	  return -1
+      }
   } else {
       mi_send_resuming_command "exec-continue" "$test"
   }
@@ -893,7 +905,7 @@ proc mi_runto_helper {func run_or_contin
 }
 
 proc mi_runto {func} {
-    mi_runto_helper $func "run"
+    return [mi_runto_helper $func "run"]
 }
 
 # Next to the next statement
-- 
Pedro Alves


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]