329ea57934
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.
107 lines
3.8 KiB
Text
107 lines
3.8 KiB
Text
# Copyright 2010-2014 Free Software Foundation, Inc.
|
|
|
|
# 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/>. */
|
|
|
|
# In some cases gdbserver cannot find the DT_DEBUG library list on its own and
|
|
# it needs to fall back to GDB solib-svr4.c look up via symbols from the main
|
|
# executable.
|
|
# gdbserver :1234 ld-linux-x86-64.so.2 /bin/prog
|
|
# gdb /bin/prog
|
|
# (gdb) target remote ...
|
|
|
|
load_lib gdbserver-support.exp
|
|
load_lib prelink-support.exp
|
|
|
|
if {[skip_gdbserver_tests] || [skip_shlib_tests]} {
|
|
return
|
|
}
|
|
|
|
# This test case (currently) does not support remote targets, since it
|
|
# assumes the ELF interpreter can be found on the host system
|
|
if [is_remote target] then {
|
|
return
|
|
}
|
|
|
|
standard_testfile solib-list-main.c
|
|
set srclibfile ${testfile}-lib.c
|
|
set binlibfile [standard_output_file ${testfile}.so]
|
|
set executable ${testfile}
|
|
set objfile ${binfile}.o
|
|
|
|
if { [get_compiler_info]
|
|
|| [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" "${binlibfile}" [list debug ldflags=-Wl,-soname,${binlibfile}]] != ""
|
|
|| [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != ""
|
|
|| [gdb_compile "${objfile} ${binlibfile}" "${binfile}" executable {}] != "" } {
|
|
untested "could not compile sources"
|
|
return -1
|
|
}
|
|
|
|
set interp_system [section_get ${binfile} .interp]
|
|
verbose -log "system interpreter is: $interp_system"
|
|
|
|
foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
|
|
|
|
# clean_restart assumes ${objdir}/${subdir}/ which is not applicable
|
|
# for ${interp_system}.
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
gdb_load ${interp_system}
|
|
gdb_load_shlibs ${binfile}
|
|
gdb_load_shlibs ${binlibfile}
|
|
|
|
# Make sure we're disconnected, in case we're testing with an
|
|
# extended-remote board, therefore already connected.
|
|
gdb_test "disconnect" ".*"
|
|
|
|
gdb_test "set non-stop $nonstop"
|
|
|
|
# It is required for the non-stop mode, GDB would try to step over
|
|
# _dl_debug_state breakpoint will still only ld.so loaded in gdbserver.
|
|
# But GDB having symbols from the main executable it would try to use
|
|
# displaced-stepping buffer at unmapped that time address _start.
|
|
gdb_test "set displaced-stepping off"
|
|
|
|
set res [gdbserver_spawn ${binfile}]
|
|
set gdbserver_protocol [lindex $res 0]
|
|
set gdbserver_gdbport [lindex $res 1]
|
|
|
|
# Load BINFILE after gdbserver_spawn (so that gdbserver executes ld.so)
|
|
# but before "target remote" below so that qSymbol data get already
|
|
# initialized from BINFILE (and not from ld.so first needing a change to
|
|
# BINFILE later).
|
|
gdb_test "file ${binfile}" {Reading symbols from .*\.\.\.done\..*} "file binfile" \
|
|
{(Are you sure you want to change the file|Load new symbol table from ".*")\? \(y or n\) } "y"
|
|
|
|
set test "target $gdbserver_protocol"
|
|
gdb_test_multiple "target $gdbserver_protocol $gdbserver_gdbport" $test {
|
|
-re "Remote debugging using .*\r\n$gdb_prompt " {
|
|
# Do not anchor end, there may be more output in non-stop mode.
|
|
pass $test
|
|
}
|
|
}
|
|
|
|
if $nonstop {
|
|
set test "non-stop interior stop"
|
|
gdb_test_multiple "" $test {
|
|
-re " #1 stopped\\.\r\n" {
|
|
pass $test
|
|
}
|
|
}
|
|
}
|
|
|
|
gdb_test "continue" "Program received signal SIGUSR1, .*"
|
|
gdb_test "sharedlibrary" ".*"
|
|
gdb_test "p libvar" " = 23"
|
|
}}
|