This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Enable non-stop mode MI tests against remote targets.
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Cc: Vladimir Prus <vladimir at codesourcery dot com>
- Date: Thu, 2 Apr 2009 00:23:31 +0100
- Subject: Re: Enable non-stop mode MI tests against remote targets.
- References: <200903260054.52525.pedro@codesourcery.com> <200903260228.28983.pedro@codesourcery.com>
On Thursday 26 March 2009 02:28:28, Pedro Alves wrote:
> 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?
Hi Vladimir, gdbserver now supports non-stop mode, so we need
to be able to test it. :-) Do you have any comments on
this approach?
> >
>
> 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