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 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


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