From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH v3 31/34] Add testing infrastruture bits for running with MI on a separate UI
Date: Fri, 06 May 2016 12:36:00 -0000 [thread overview]
Message-ID: <1462538104-19109-32-git-send-email-palves@redhat.com> (raw)
In-Reply-To: <1462538104-19109-1-git-send-email-palves@redhat.com>
With this, a specific test may can start GDB with MI on a separate UI
by using:
mi_gdb_start separate-mi-tty
In addition, it's also possible to run the whole testsuite with MI on
a separate tty, with:
make check RUNTESTFLAGS="FORCE_SEPARATE_MI_TTY=1"
gdb_main_spawn_id and mi_spawn_id are added so that tests may expect
output from either channel.
While at it, inferior_spawn_id was not being cleared when gdb exits,
unlike the other spawn ids, thus a test that starts gdb more than once
would end up using a stale spawn id.
gdb/testsuite/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>
* README (Testsuite Parameters): Document FORCE_SEPARATE_MI_TTY.
* lib/gdb.exp (default_gdb_exit): Clear inferior_spawn_id.
* lib/mi-support.exp (mi_uncatched_gdb_exit): Unset
gdb_main_spawn_id, mi_spawn_id, unset inferior_spawn_id.
(gdb_main_spawn_id, mi_spawn_id): Declare and
comment.
(mi_create_inferior_pty): New procedure,
factored out from default_mi_gdb_start.
(switch_gdb_spawn_id, mi_gdb_start_separate_mi_tty): New
procedures.
(default_mi_gdb_start): Call mi_gdb_start_separate_mi_tty if the
separate-mi-tty option is specified, or SEPARATE_MI_TTY is set.
Use mi_create_inferior_pty.
(mi_gdb_start): Use eval to pass down args list.
---
gdb/testsuite/README | 6 ++
gdb/testsuite/lib/gdb.exp | 3 +-
gdb/testsuite/lib/mi-support.exp | 159 ++++++++++++++++++++++++++++++++-------
3 files changed, 139 insertions(+), 29 deletions(-)
diff --git a/gdb/testsuite/README b/gdb/testsuite/README
index 043a8bd..152318a 100644
--- a/gdb/testsuite/README
+++ b/gdb/testsuite/README
@@ -208,6 +208,12 @@ FORCE_PARALLEL
Setting FORCE_PARALLEL to any non-empty value forces parallel testing
mode even if RUNTESTFLAGS is not empty.
+FORCE_SEPARATE_MI_TTY
+
+Setting FORCE_MI_SEPARATE_UI to 1 forces all MI testing to start GDB
+in console mode, with MI running on a separate TTY, on a secondary UI
+started with "new-ui".
+
GDB_INOTIFY
For debugging parallel mode, it is handy to be able to see when a test
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 6d25b0c..a374370 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1359,7 +1359,7 @@ proc default_gdb_exit {} {
global GDB
global INTERNAL_GDBFLAGS GDBFLAGS
global verbose
- global gdb_spawn_id
+ global gdb_spawn_id inferior_spawn_id
global inotify_log_file
gdb_stop_suppressing_tests
@@ -1400,6 +1400,7 @@ proc default_gdb_exit {} {
remote_close host
}
unset gdb_spawn_id
+ unset inferior_spawn_id
}
# Load a file into the debugger.
diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp
index 87ce634..4c4a71a 100644
--- a/gdb/testsuite/lib/mi-support.exp
+++ b/gdb/testsuite/lib/mi-support.exp
@@ -28,6 +28,16 @@ if ![info exists mi_gdb_prompt] then {
global mi_inferior_tty_name
+# Always points to GDB's main UI spawn ID, even when testing with MI
+# running on a secondary UI.
+global gdb_main_spawn_id
+
+# Points to the spawn id of the MI channel. When testing with MI
+# running as the primary/main UI, this is the same as
+# gdb_main_spawn_id, but will be different when testing with MI
+# running on a secondary UI.
+global mi_spawn_id
+
set MIFLAGS "-i=mi"
set thread_selected_re "=thread-selected,id=\"\[0-9\]+\"\r\n"
@@ -46,7 +56,8 @@ proc mi_uncatched_gdb_exit {} {
global GDB
global INTERNAL_GDBFLAGS GDBFLAGS
global verbose
- global gdb_spawn_id
+ global gdb_spawn_id gdb_main_spawn_id
+ global mi_spawn_id inferior_spawn_id
global gdb_prompt
global mi_gdb_prompt
global MIFLAGS
@@ -83,14 +94,103 @@ proc mi_uncatched_gdb_exit {} {
remote_close host
}
unset gdb_spawn_id
+ unset gdb_main_spawn_id
+ unset mi_spawn_id
+ unset inferior_spawn_id
+}
+
+# Create the PTY for the inferior process and tell GDB about it.
+
+proc mi_create_inferior_pty {} {
+ global mi_gdb_prompt
+ global inferior_spawn_id
+ global mi_inferior_tty_name
+
+ spawn -pty
+ set inferior_spawn_id $spawn_id
+ set tty_name $spawn_out(slave,name)
+ set mi_inferior_tty_name $tty_name
+
+ send_gdb "102-inferior-tty-set $tty_name\n"
+ gdb_expect 10 {
+ -re ".*102\\\^done\r\n$mi_gdb_prompt$" {
+ verbose "redirect inferior output to new terminal device."
+ }
+ timeout {
+ warning "Couldn't redirect inferior output." 2
+ }
+ }
+}
+
+# Switch the default spawn id to SPAWN_ID, so that mi_gdb_test
+# etc. default to using it.
+
+proc switch_gdb_spawn_id {spawn_id} {
+ global gdb_spawn_id
+ global board board_info
+
+ set gdb_spawn_id $spawn_id
+ set board [host_info name]
+ set board_info($board,fileid) $spawn_id
+}
+
+proc mi_gdb_start_separate_mi_tty { args } {
+ global gdb_prompt mi_gdb_prompt
+ global timeout
+ global gdb_spawn_id gdb_main_spawn_id mi_spawn_id
+ global inferior_spawn_id
+
+ set separate_inferior_pty 0
+
+ foreach arg $args {
+ if {$arg == "separate-inferior-tty"} {
+ set separate_inferior_pty 1
+ }
+ }
+
+ gdb_start
+
+ # Create the new PTY for the MI UI.
+ spawn -pty
+ set mi_spawn_id $spawn_id
+ set mi_tty_name $spawn_out(slave,name)
+ gdb_test_multiple "new-ui mi $mi_tty_name\"" "new-ui" {
+ -re "New UI allocated\r\n$gdb_prompt $" {
+ }
+ }
+
+ # Switch to the MI channel.
+ set gdb_main_spawn_id $gdb_spawn_id
+ switch_gdb_spawn_id $mi_spawn_id
+
+ # Consume pending output and MI prompt.
+ gdb_expect {
+ -re "$mi_gdb_prompt$" {
+ }
+ default {
+ perror "MI channel failed"
+ remote_close host
+ return -1
+ }
+ }
+
+ if {$separate_inferior_pty} {
+ mi_create_inferior_pty
+ }
+
+ mi_detect_async
+
+ return 0
}
#
-# default_mi_gdb_start [INFERIOR_PTY] -- start gdb running, default procedure
+# default_mi_gdb_start [FLAGS] -- start gdb running, default procedure
#
-# INFERIOR_PTY should be set to separate-inferior-tty to have the inferior work
-# with it's own PTY. If set to same-inferior-tty, the inferior shares GDB's PTY.
-# The default value is same-inferior-tty.
+# If "separate-inferior-tty" is specified, the inferior works with
+# it's own PTY.
+#
+# If "separate-mi-tty" is specified, the gdb starts in CLI mode, with
+# MI running on a secondary UI, on its own tty.
#
# When running over NFS, particularly if running many simultaneous
# tests on different hosts all using the same server, things can
@@ -103,8 +203,29 @@ proc default_mi_gdb_start { args } {
global gdb_prompt
global mi_gdb_prompt
global timeout
- global gdb_spawn_id inferior_spawn_id
+ global gdb_spawn_id gdb_main_spawn_id inferior_spawn_id mi_spawn_id
global MIFLAGS
+ global SEPARATE_MI_TTY
+
+ if {[info exists FORCE_SEPARATE_MI_TTY]} {
+ set separate_mi_pty $FORCE_SEPARATE_MI_TTY
+ } else {
+ set separate_mi_pty 0
+ }
+
+ set separate_inferior_pty 0
+
+ foreach arg $args {
+ if {$arg == "separate-mi-tty"} {
+ set separate_mi_pty 1
+ } elseif {$arg == "separate-inferior-tty"} {
+ set separate_inferior_pty 1
+ }
+ }
+
+ if {$separate_mi_pty} {
+ return [eval mi_gdb_start_separate_mi_tty $args]
+ }
gdb_stop_suppressing_tests
set inferior_pty no-tty
@@ -112,12 +233,6 @@ proc default_mi_gdb_start { args } {
# Set the default value, it may be overriden later by specific testfile.
set use_gdb_stub [target_info exists use_gdb_stub]
- if { [llength $args] == 1} {
- set inferior_pty [lindex $args 0]
- }
-
- set separate_inferior_pty [string match $inferior_pty separate-inferior-tty]
-
# Start SID.
if { [info procs sid_start] != "" } {
verbose "Spawning SID"
@@ -182,6 +297,8 @@ proc default_mi_gdb_start { args } {
}
}
set gdb_spawn_id $res
+ set gdb_main_spawn_id $res
+ set mi_spawn_id $res
# FIXME: mi output does not go through pagers, so these can be removed.
# force the height to "unlimited", so no pagers get used
@@ -205,22 +322,8 @@ proc default_mi_gdb_start { args } {
}
}
- # Create the new PTY for the inferior process.
if { $separate_inferior_pty } {
- spawn -pty
- global mi_inferior_tty_name
- set inferior_spawn_id $spawn_id
- set mi_inferior_tty_name $spawn_out(slave,name)
-
- send_gdb "102-inferior-tty-set $mi_inferior_tty_name\n"
- gdb_expect 10 {
- -re ".*102\\\^done\r\n$mi_gdb_prompt$" {
- verbose "redirect inferior output to new terminal device."
- }
- timeout {
- warning "Couldn't redirect inferior output." 2
- }
- }
+ mi_create_inferior_pty
}
if {![info exists inferior_spawn_id]} {
@@ -237,7 +340,7 @@ proc default_mi_gdb_start { args } {
# baseboard file.
#
proc mi_gdb_start { args } {
- return [default_mi_gdb_start $args]
+ return [eval default_mi_gdb_start $args]
}
# Many of the tests depend on setting breakpoints at various places and
--
2.5.5
next prev parent reply other threads:[~2016-05-06 12:36 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-06 12:35 [PATCH v3 00/34] Towards great frontend GDB consoles Pedro Alves
2016-05-06 12:35 ` [PATCH v3 20/34] Make gdb_in_secondary_prompt_p() be per UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 33/34] Make mi-break.exp always expect breakpoint commands output on the main UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 02/34] [Ada catchpoints] Fix "warning: failed to get exception name: No definition of \"e.full_name\" in current context" Pedro Alves
2016-05-06 12:35 ` [PATCH v3 21/34] Replace the sync_execution global with a new enum prompt_state tristate Pedro Alves
2016-05-06 12:35 ` [PATCH v3 14/34] Make command line editing (use of readline) be per UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 01/34] Prepare gdb.python/mi-py-events.exp for Python/MI in separate channels Pedro Alves
2016-05-06 12:35 ` [PATCH v3 24/34] Push thread->control.command_interp to the struct thread_fsm Pedro Alves
2016-07-01 11:02 ` Thomas Preudhomme
[not found] ` <20144b4c-11ee-fc84-e3ad-b9992f14ce15@redhat.com>
2016-07-01 15:24 ` [PATCH] Build gdb.opt/inline-*.exp tests at -O0, rely on __attribute__((always_inline)) (was: Re: [PATCH v3 24/34] Push thread->control.command_interp to the struct thread_fsm) Thomas Preudhomme
2016-07-15 12:05 ` Thomas Preudhomme
2016-07-19 17:02 ` [PATCH] Build gdb.opt/inline-*.exp tests at -O0, rely on __attribute__((always_inline)) Pedro Alves
2016-07-20 16:35 ` Thomas Preudhomme
2016-05-06 12:35 ` [PATCH v3 29/34] Add new command to create extra console/mi UI channels Pedro Alves
2016-05-26 18:34 ` Pedro Alves
2016-05-06 12:35 ` [PATCH v3 03/34] Introduce "struct ui" Pedro Alves
2016-05-06 12:35 ` [PATCH v3 15/34] Always process target events in the main UI Pedro Alves
2016-05-06 12:35 ` [PATCH v3 16/34] Make target_terminal_inferior/ours almost nops on non-main UIs Pedro Alves
2016-05-06 12:36 ` Pedro Alves [this message]
2016-06-28 20:19 ` [PATCH v3 31/34] Add testing infrastruture bits for running with MI on a separate UI Simon Marchi
2016-06-29 10:50 ` Pedro Alves
2016-06-30 11:12 ` [pushed] Fix gdbserver/MI testing regression (was: Re: [PATCH v3 31/34] Add testing infrastruture bits for running with MI on a separate UI) Pedro Alves
2016-06-30 12:10 ` gdbserver/ada testing broken (was: Re: [pushed] Fix gdbserver/MI testing regression) Pedro Alves
2016-07-04 20:40 ` gdbserver/ada testing broken Simon Marchi
2016-07-05 15:28 ` Joel Brobecker
2016-07-05 15:47 ` Joel Brobecker
2016-07-05 16:36 ` gdbserver/ada testing broken (was: Re: [pushed] Fix gdbserver/MI testing regression) Joel Brobecker
2016-07-05 17:19 ` gdbserver/ada testing broken Simon Marchi
2016-07-06 13:23 ` Joel Brobecker
2016-07-06 14:28 ` Simon Marchi
2016-07-19 17:11 ` Pedro Alves
2016-07-04 17:22 ` [pushed] Fix gdbserver/MI testing regression Simon Marchi
2016-05-06 12:40 ` [PATCH v3 13/34] Make current_ui_out be per UI Pedro Alves
2016-05-06 12:40 ` [PATCH v3 23/34] New function should_print_stop_to_console Pedro Alves
2016-05-06 12:40 ` [PATCH v3 11/34] Make out and error streams be per UI Pedro Alves
2016-05-06 12:41 ` [PATCH v3 06/34] Introduce interpreter factories Pedro Alves
2016-05-18 19:18 ` Simon Marchi
2016-05-26 18:11 ` Pedro Alves
2016-05-18 19:20 ` Simon Marchi
2016-05-26 18:08 ` Pedro Alves
2016-05-06 12:42 ` [PATCH v3 30/34] [DOC] Document support for running interpreters on separate UI channels Pedro Alves
2016-05-06 13:04 ` Eli Zaretskii
2016-05-26 11:11 ` Pedro Alves
2016-06-17 17:24 ` Pedro Alves
2016-06-17 20:02 ` Eli Zaretskii
2016-05-06 12:43 ` [PATCH v3 28/34] Make stdin be per UI Pedro Alves
2016-05-06 12:43 ` [PATCH v3 07/34] Make the intepreters output to all UIs Pedro Alves
2016-05-19 15:16 ` Simon Marchi
2016-05-26 18:12 ` Pedro Alves
2016-05-06 12:43 ` [PATCH v3 25/34] Only send sync execution command output to the UI that ran the command Pedro Alves
2016-05-06 12:43 ` [PATCH v3 08/34] Always run async signal handlers in the main UI Pedro Alves
2016-05-19 19:28 ` Simon Marchi
2016-05-26 18:13 ` Pedro Alves
2016-05-26 18:15 ` Simon Marchi
2016-05-06 12:43 ` [PATCH v3 05/34] Make the interpreters be per UI Pedro Alves
2016-05-18 17:51 ` Simon Marchi
2016-05-26 18:08 ` Pedro Alves
2016-05-06 12:43 ` [PATCH v3 10/34] Make input_fd " Pedro Alves
2016-05-06 12:43 ` [PATCH v3 12/34] Delete def_uiout Pedro Alves
2016-05-06 12:43 ` [PATCH v3 17/34] Introduce display_mi_prompt Pedro Alves
2016-05-06 12:43 ` [PATCH v3 04/34] Make gdb_stdout&co be per UI Pedro Alves
2016-05-06 12:45 ` [PATCH v3 27/34] Handle UI's terminal closing Pedro Alves
2016-05-06 12:45 ` [PATCH v3 22/34] Fix for spurious prompts in secondary UIs Pedro Alves
2016-05-06 12:45 ` [PATCH v3 26/34] Make main_ui be heap allocated Pedro Alves
2016-05-06 12:45 ` [PATCH v3 34/34] Always switch fork child to the main UI Pedro Alves
2016-05-06 12:45 ` [PATCH v3 32/34] Send deleted watchpoint-scope output to all UIs Pedro Alves
2016-05-06 12:52 ` [PATCH v3 18/34] Make raw_stdout be per MI instance Pedro Alves
2016-05-06 12:53 ` [PATCH v3 19/34] Simplify starting the command event loop Pedro Alves
2016-05-06 12:53 ` [PATCH v3 09/34] Make instream be per UI Pedro Alves
2016-05-26 18:37 ` [PATCH v3 35/34] Add "new-ui console" tests Pedro Alves
2016-06-21 0:23 ` [pushed] Re: [PATCH v3 00/34] Towards great frontend GDB consoles Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1462538104-19109-32-git-send-email-palves@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox