2014-01-01 03:54:24 +00:00
|
|
|
# Copyright 2002-2014 Free Software Foundation, Inc.
|
2008-08-19 14:13:29 +00:00
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2011-07-18 04:14:21 +00:00
|
|
|
|
|
|
|
if { ![support_displaced_stepping] } {
|
|
|
|
unsupported "displaced stepping"
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
2008-08-19 14:13:29 +00:00
|
|
|
load_lib mi-support.exp
|
|
|
|
set MIFLAGS "-i=mi"
|
|
|
|
|
|
|
|
gdb_exit
|
|
|
|
if {[mi_gdb_start]} {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2010-01-28 22:14:12 +00:00
|
|
|
proc mi_nonstop_resume { command test } {
|
|
|
|
if { [mi_send_resuming_command $command $test] != 0 } {
|
|
|
|
# If a resume fails, assume non-stop is broken or unsupported
|
|
|
|
# for this target. We have logged a FAIL or UNSUPPORTED; skip
|
|
|
|
# the remaining tests to limit timeouts.
|
|
|
|
return -code continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-19 14:13:29 +00:00
|
|
|
#
|
|
|
|
# Start here
|
|
|
|
#
|
2012-07-10 15:32:52 +00:00
|
|
|
standard_testfile non-stop.c
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2012-07-10 15:32:52 +00:00
|
|
|
set options [list debug]
|
2008-08-19 14:13:29 +00:00
|
|
|
if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
|
|
|
|
mi_gdb_reinitialize_dir $srcdir/$subdir
|
|
|
|
mi_gdb_load $binfile
|
|
|
|
|
|
|
|
mi_gdb_test "-gdb-set non-stop 1" ".*"
|
enable target async by default; separate MI and target notions of async
This finally makes background execution commands possible by default.
However, in order to do that, there's one last thing we need to do --
we need to separate the MI and target notions of "async". Unlike the
CLI, where the user explicitly requests foreground vs background
execution in the execution command itself (c vs c&), MI chose to treat
"set target-async" specially -- setting it changes the default
behavior of execution commands.
So, we can't simply "set target-async" default to on, as that would
affect MI frontends. Instead we have to make the setting MI-specific,
and teach MI about sync commands on top of an async target.
Because the "target" word in "set target-async" ends up as a potential
source of confusion, the patch adds a "set mi-async" option, and makes
"set target-async" a deprecated alias.
Rather than make the targets always async, this patch introduces a new
"maint set target-async" option so that the GDB developer can control
whether the target is async. This makes it simpler to debug issues
arising only in the synchronous mode; important because sync mode
seems unlikely to go away.
Unlike in previous revisions, "set target-async" does not affect this
new maint parameter. The rationale for this is that then one can
easily run the test suite in the "maint set target-async off" mode and
have tests that enable mi-async fail just like they fail on
non-async-capable targets. This emulation is exactly the point of the
maint option.
I had asked Tom in a previous iteration to split the actual change of
the target async default to a separate patch, but it turns out that
that is quite awkward in this version of the patch, because with MI
async and target async decoupled (unlike in previous versions), if we
don't flip the default at the same time, then just "set target-async
on" alone never actually manages to do anything. It's best to not
have that transitory state in the tree.
Given "set target-async on" now only has effect for MI, the patch goes
through the testsuite removing it from non-MI tests. MI tests are
adjusted to use the new and less confusing "mi-async" spelling.
2014-05-29 Pedro Alves <palves@redhat.com>
Tom Tromey <tromey@redhat.com>
* NEWS: Mention "maint set target-async", "set mi-async", and that
background execution commands are now always available.
* target.h (target_async_permitted): Update comment.
* target.c (target_async_permitted, target_async_permitted_1):
Default to 1.
(set_target_async_command): Rename to ...
(maint_set_target_async_command): ... this.
(show_target_async_command): Rename to ...
(maint_show_target_async_command): ... this.
(_initialize_target): Adjust.
* infcmd.c (prepare_execution_command): Make extern.
* inferior.h (prepare_execution_command): Declare.
* infrun.c (set_observer_mode): Leave target async alone.
* mi/mi-interp.c (mi_interpreter_init): Install
mi_on_sync_execution_done as sync_execution_done observer.
(mi_on_sync_execution_done): New function.
(mi_execute_command_input_handler): Don't print the prompt if we
just started a synchronous command with an async target.
(mi_on_resume): Check sync_execution before printing prompt.
* mi/mi-main.h (mi_async_p): Declare.
* mi/mi-main.c: Include gdbcmd.h.
(mi_async_p): New function.
(mi_async, mi_async_1): New globals.
(set_mi_async_command, show_mi_async_command, mi_async): New
functions.
(exec_continue): Call prepare_execution_command.
(run_one_inferior, mi_cmd_exec_run, mi_cmd_list_target_features)
(mi_execute_async_cli_command): Use mi_async_p.
(_initialize_mi_main): Install "set mi-async". Make
"target-async" a deprecated alias.
2014-05-29 Pedro Alves <palves@redhat.com>
Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Non-Stop Mode): Remove "set target-async 1"
from example.
(Asynchronous and non-stop modes): Document '-gdb-set mi-async'.
Mention that target-async is now deprecated.
(Maintenance Commands): Document maint set/show target-async.
2014-05-29 Pedro Alves <palves@redhat.com>
Tom Tromey <tromey@redhat.com>
* gdb.base/async-shell.exp: Don't enable target-async.
* gdb.base/async.exp
* gdb.base/corefile.exp (corefile_test_attach): Remove 'async'
parameter. Adjust.
(top level): Don't test with "target-async".
* gdb.base/dprintf-non-stop.exp: Don't enable target-async.
* gdb.base/gdb-sigterm.exp: Don't test with "target-async".
* gdb.base/inferior-died.exp: Don't enable target-async.
* gdb.base/interrupt-noterm.exp: Likewise.
* gdb.mi/mi-async.exp: Use "mi-async" instead of "target-async".
* gdb.mi/mi-nonstop-exit.exp: Likewise.
* gdb.mi/mi-nonstop.exp: Likewise.
* gdb.mi/mi-ns-stale-regcache.exp: Likewise.
* gdb.mi/mi-nsintrall.exp: Likewise.
* gdb.mi/mi-nsmoribund.exp: Likewise.
* gdb.mi/mi-nsthrexec.exp: Likewise.
* gdb.mi/mi-watch-nonstop.exp: Likewise.
* gdb.multi/watchpoint-multi.exp: Adjust comment.
* gdb.python/py-evsignal.exp: Don't enable target-async.
* gdb.python/py-evthreads.exp: Likewise.
* gdb.python/py-prompt.exp: Likewise.
* gdb.reverse/break-precsave.exp: Don't test with "target-async".
* gdb.server/solib-list.exp: Don't enable target-async.
* gdb.threads/thread-specific-bp.exp: Likewise.
* lib/mi-support.exp: Adjust to use mi-async.
2014-05-29 18:58:57 +00:00
|
|
|
mi_gdb_test "-gdb-set mi-async 1" ".*"
|
2011-08-09 17:45:19 +00:00
|
|
|
mi_detect_async
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2009-04-02 15:43:10 +00:00
|
|
|
if { [mi_run_to_main] < 0 } {
|
|
|
|
continue
|
2008-08-21 15:09:42 +00:00
|
|
|
}
|
2008-08-19 14:13:29 +00:00
|
|
|
|
Introduce some new MI test suite cleanups for breakpoint and
breakpoint table handling. This is a patch in five parts (all committed
here in one commit).
----- 1/5: parse_args
parse_args is a very useful utility function which allows you to do
getopt-y kinds of things in Tcl.
Example:
proc myproc {foo args} {
parse_args {{bar} {baz "abc"} {qux}}
# ...
}
myproc ABC -bar -baz DEF peanut butter
will define the following variables in myproc:
foo (=ABC), bar (=1), baz (=DEF), and qux (=0)
args will be the list {peanut butter}
----- 2/5: mi_build_kv_pairs
build_kv_pairs simply does what it says: given the input list
and an option join string, it combines list elements into kv-pairs
for MI handling. It knows how to handle tuples and other special
MI types.
Example:
mi_build_kv_pairs {a b c d e f g \[.*\]}
returns a=\"b\",c=\"d\",e=\"f\",g=\[.*\]
----- 3/5: mi_make_breakpoint
This function builds breakpoint regexps, such as
"bkpt={number=\".*\", [snip]}".
Note that ONLY the options given to mi_make_breakpoint/mi_create_breakpoint
will actually be tested. So if -number is omitted, the regexp will allow
anything [number=\".*\"]
Examples:
mi_make_breakpoint -number 3
mi_create_breakpoint "myfile.c:21" -file myfile.c -line 21
----- 4/5: mi_make_breakpoint_table
This function builds MI breakpoint table regexps.
Example:
set bps {}
lappend bps [mi_make_breakpoint -number 1 -func "main" \
-file ".*/myfile.c" -line 42
lappend bps [mi_make_breakpoint -number 2 -func "marker" \
-file ".*myfile.c" -line 21
gdb_test "-break-info" "\\^done,[mi_make_breakpoint_table $bps]" \
"breakpoint list"
----- 5/5: Update all callers
Self-explanatory
testsuite/ChangeLog
2014-04-23 Keith Seitz <keiths@redhat.com>
* lib/mi-support.exp (mi_list_breakpoints): Delete.
(mi_make_breakpoint_table): New procedure.
(mi_create_breakpoint): Use mi_make_breakpoint
and return the result.
(mi_make_breakpoint): New procedure.
(mi_build_kv_pairs): New procedure.
* gdb.mi/mi-break.exp: Remove unused globals,
update mi_create_breakpoint usage, and use mi_make_breakpoint_table.
All callers updated.
* gdb.mi/mi-dprintf.exp: Use variable to track command
number.
Update all callers of mi_create_breakpoint and use
mi_make_breakpoint_table.
Remove any unused global variables.
* gdb.mi/mi-nonstop.exp: Likewise.
* gdb.mi/mi-nsintrall.exp: Likewise.
* gdb.mi/mi-nsmoribund.exp: Likewise.
* gdb.mi/mi-nsthrexec.exp: Likewise.
* gdb.mi/mi-reverse.exp: Likewise.
* gdb.mi/mi-simplerun.exp: Likewise.
* gdb.mi/mi-stepn.exp: Likewise.
* gdb.mi/mi-syn-frame.exp: Likewise.
* gdb.mi/mi-until.exp: Likewise.
* gdb.mi/mi-var-cp.exp: Likewise.
* gdb.mi/mi-var-display.exp: Likewise.
* gdb.mi/mi2-amd64-entry-value.exp: Likewise.
* gdb.mi/mi2-var-child.exp: Likewise.
* gdb.mi/mi-vla-c99.exp: Likewise.
* lib/mi-support.exp: Likewise.
From Ian Lance Taylor <iant@cygnus.com>:
* lib/gdb.exp (parse_args): New procedure.
2014-04-23 19:17:31 +00:00
|
|
|
mi_create_breakpoint break_at_me "breakpoint at marker" \
|
|
|
|
-number 2 -func break_at_me
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2010-01-28 22:14:12 +00:00
|
|
|
mi_nonstop_resume "exec-continue" "resume 1"
|
2008-08-19 14:13:29 +00:00
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i0 stop"
|
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i0 stop"
|
|
|
|
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 1"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
|
|
|
mi_gdb_test "-thread-select 2" "\\^done.*" "select thread 2"
|
|
|
|
mi_create_varobj I_W0 "i" "create varobj in first thread"
|
|
|
|
mi_gdb_test "-thread-select 3" "\\^done.*" "select thread 3"
|
|
|
|
mi_create_varobj I_W1 "i" "create varobj in second thread"
|
|
|
|
|
2010-01-28 22:14:12 +00:00
|
|
|
mi_nonstop_resume "exec-continue --thread 2" "resume 1"
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "running" "stopped"} "thread state, resume 1"
|
2008-08-19 14:13:29 +00:00
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i1 stop"
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 2"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2010-01-28 22:14:12 +00:00
|
|
|
mi_nonstop_resume "exec-continue --thread 3" "resume 2"
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "stopped" "running"} "thread state, resume 2"
|
2008-08-19 14:13:29 +00:00
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i1 stop"
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 3"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
|
|
|
mi_varobj_update * {I_W1 I_W0} "update varobj, 1"
|
|
|
|
mi_check_varobj_value I_W0 1 "check varobj, w0, 1"
|
|
|
|
mi_check_varobj_value I_W1 1 "check varobj, w1, 1"
|
|
|
|
|
2011-05-27 14:16:43 +00:00
|
|
|
mi_gdb_test "-exec-interrupt --thread 1" "\\^done" "interrupted"
|
|
|
|
mi_expect_interrupt "got interrupt"
|
|
|
|
|
2008-08-19 14:13:29 +00:00
|
|
|
# The interrupt command sends SIGINT to the target, and therefore the
|
|
|
|
# thread might not be stopped immediately when we return from the target.
|
|
|
|
# So, wait a bit
|
|
|
|
sleep 1
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"stopped" "stopped" "stopped"} "thread state, stop 4"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2011-05-27 14:16:43 +00:00
|
|
|
mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"3\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"1\"" \
|
|
|
|
"resume all"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
2008-09-13 17:54:06 +00:00
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" "\[^\n\]*" "non-stop.c" "\[0-9\]*" {"" "disp=\"keep\""} "w0,i2 stop"
|
2008-08-19 14:13:29 +00:00
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i2 stop"
|
|
|
|
|
|
|
|
# At this point, thread 1 (main) is running, and worker threads are stopped.
|
|
|
|
# Check that we can modify breakpoint condition, even when operating on a
|
|
|
|
# running thread.
|
|
|
|
mi_gdb_test "-break-condition --thread 1 2 id==1" "\\^done" "set condition, 1"
|
|
|
|
|
2010-01-28 22:14:12 +00:00
|
|
|
mi_nonstop_resume "exec-continue --thread 2" "resume 2"
|
|
|
|
mi_nonstop_resume "exec-continue --thread 3" "resume 3"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
|
|
|
sleep 2
|
|
|
|
mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i3 stop"
|
2008-09-22 11:00:41 +00:00
|
|
|
mi_check_thread_states {"running" "running" "stopped"} "thread state, stop on cond breakpoint"
|
2008-08-19 14:13:29 +00:00
|
|
|
|
|
|
|
# Check that when we update all varobj, we don't get no error about varobj
|
|
|
|
# bound to running thread.
|
|
|
|
mi_varobj_update * {I_W1} "update varobj, 2"
|
|
|
|
mi_check_varobj_value I_W1 3 "check varobj, w1, 1"
|
|
|
|
|
|
|
|
|
|
|
|
# Check that stack commands are allowed on a stopped thread, even if some other threads
|
|
|
|
# are running, and produce something sane. Also check we check error on running thread.
|
|
|
|
mi_gdb_test "-stack-list-frames --thread 2" "\\^error,msg=\".*\"" "stacktrace of running thread"
|
|
|
|
mi_gdb_test "-stack-list-frames --thread 3" \
|
|
|
|
"\\^done,stack=\\\[frame={level=\"0\",addr=\".*\",func=\"break_at_me\".*" \
|
|
|
|
"stacktrace of stopped thread"
|
|
|
|
|
|
|
|
# verify that after thread exit, the thread is reported as exited in -thread-info, and
|
|
|
|
# we can still interact with other threads.
|
|
|
|
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"
|
2009-04-02 15:43:10 +00:00
|
|
|
|
|
|
|
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 {
|
Multiexec MI
* breakpoint.c (clear_syscall_counts): Take struct inferior*.
* inferior.c (add_inferior_silent): Notify inferior_added
observer.
(delete_inferior_1): Notify inferior_removed observer.
(exit_inferior_1): Pass inferior, not pid, to observer.
(inferior_appeared): Likewise.
(add_inferior_with_spaces): New.
(add_inferior_command): Use the above.
* inferior.h (delete_inferior_1, add_inferior_with_spaces):
Declare.
* inflow.c (inflow_inferior_exit): Likewise.
* jit.c (jit_inferior_exit_hook): Likewise.
* mi/mi-cmds.c (mi_cmds): Register add-inferior and
remove-inferior.
* mi/mi-cmds.h (mi_cmd_add_inferior, mi_cmd_remove_inferior): New.
* mi/mi-interp.c (mi_inferior_added, mi_inferior_removed): New.
(report_initial_inferior): New.
(mi_inferior_removed): Register the above. Make sure
inferior_added observer is called on the first inferior.
(mi_new_thread, mi_thread_exit): Thread group is now identified by
inferior number, not pid.
(mi_solib_loaded, mi_solib_unloaded): Report which inferiors are
affected.
* mi/mi-main.c (current_context): New.
(proceed_thread_callback): Use typed closure.
Proceed everything if pid is 0. Most implementation split into
(proceed_thread): ... this.
(run_one_inferior): New.
(mi_cmd_exec_continue, mi_cmd_exec_interrupt, mi_cmd_exec_run):
Adjust for multiexec behaviour.
(mi_cmd_add_inferior, mi_cmd_remove_inferior): New.
(mi_cmd_execute): Handle the 'thread-group' option here.
Do some extra checks.
* mi-parse.c (mi_parse): Handle the --all and --thread-group
options.
* mi-parse.h (struct mi_parse): New fields all and thread_group.
2010-02-24 07:51:46 +00:00
|
|
|
-re ".*=thread-exited,id=\"2\",group-id=\"i\[0-9\]+\"\r\n$" {
|
2009-04-02 15:43:10 +00:00
|
|
|
pass $test
|
|
|
|
}
|
|
|
|
timeout {
|
|
|
|
fail "$test (timeout)"
|
|
|
|
}
|
2008-08-19 14:13:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# See that we can still poke other threads.
|
|
|
|
mi_gdb_test "-stack-list-frames --thread 3" \
|
|
|
|
"\\^done,stack=\\\[frame={level=\"0\",addr=\".*\",func=\"break_at_me\".*" \
|
|
|
|
"stacktrace of stopped thread"
|
|
|
|
|
|
|
|
mi_gdb_exit
|