gdb/testsuite: capture GDB tty name in default_gdb_spawn

The TUI test gdb.tui/empty.exp fails with the native-extended-gdbserver
board, and takes a very long time to run due to numerous timeouts.  The
symptom, when looking at the logs, is that the TUI windows that we
expect to be resized are not resized.  Digging down, I found that GDB
didn't receive any SIGWINCH that should have resulted from
Term::resize's stty calls.

The reason for this is:

- The native-extended-gdbserver overrides gdb_start to first start GDB,
  then start GDBserver with --multi, then connect GDB to GDBserver.
  This means that two TCL "spawn"s are done, one for GDB and one for
  GDBserver.

- The TUI test framework  wants to know GDB's TTY name, so it can pass
  it to stty, to fake terminal resizes.  To do so, it overrides the
  spawn built-in proc to capture the tty name from the internals of the
  built-in proc.  It saves the TTY name to the gdb_spawn_name global
  variable.

- Because the native-extended-gdbserver boards starts both GDB and
  GDBserver, the final value of gdb_spawn_name is the name of
  GDBserver's TTY.

- When the TUI test framework attempts to resize GDB's terminal, it in
  fact resizes GDBserver's terminal.  So obviously, GDB doesn't get the
  SIGWINCH, and we don't get the expected TUI redraw.

Fix that by moving the hack to lib/gdb.exp, overriding the builtin spawn
all the time.  The override saves the TTY name in the
last_spawn_tty_name global.  The default_gdb_spawn proc then saves it in
the gdb_tty_name global.  This way, we specifically capture GDB's TTY
name in gdb_tty_name, not the TTY name of other spawned processes.

Remove tuiterm_env_init and tuiterm_env_finish, since they are now
empty.  In turn, the gdb_finish_hooks mechanism is now unused, remove it
as well.  It would be easy to add them back if needed.

gdb/ChangeLog:

	* lib/gdb.exp (default_gdb_exit): Unset gdb_tty_name.
	(spawn_capture_tty_name): New, override builtin spawn.
	(default_gdb_spawn): Capture GDB's TTY name.
	* lib/tuiterm.exp (tuiterm_spawn): Remove.
	(tuiterm_env_init, tuiterm_env_finish): Remove spawn override.
	(Term) <resize>: Use new variable name.
	(tuiterm_env_init, tuiterm_env_finish): Remove.
	(tuiterm_env): Don't call tuiterm_env_init and register
	tuiterm_env_finish in gdb_finish_hooks.
	(gdb_finish_hooks): Remove.
	(gdb_finish): Don't call finish hooks.

Change-Id: Ia5ab74184a52a996416022308f8d0cc523355a78
This commit is contained in:
Simon Marchi
2021-06-10 14:30:33 -04:00
parent 6179e5f1d8
commit 9edb1e0191
3 changed files with 40 additions and 40 deletions

View File

@ -1,3 +1,17 @@
2021-06-10 Simon Marchi <simon.marchi@polymtl.ca>
* lib/gdb.exp (default_gdb_exit): Unset gdb_tty_name.
(spawn_capture_tty_name): New, override builtin spawn.
(default_gdb_spawn): Capture GDB's TTY name.
* lib/tuiterm.exp (tuiterm_spawn): Remove.
(tuiterm_env_init, tuiterm_env_finish): Remove spawn override.
(Term) <resize>: Use new variable name.
(tuiterm_env_init, tuiterm_env_finish): Remove.
(tuiterm_env): Don't call tuiterm_env_init and register
tuiterm_env_finish in gdb_finish_hooks.
(gdb_finish_hooks): Remove.
(gdb_finish): Don't call finish hooks.
2021-06-08 Lancelot Six <lsix@lancelotsix.com>
* python/lib/gdb/FrameDecorator.py (FrameDecorator): Use 'is None'

View File

@ -1909,6 +1909,7 @@ proc default_gdb_exit {} {
remote_close host
}
unset gdb_spawn_id
unset ::gdb_tty_name
unset inferior_spawn_id
}
@ -2037,6 +2038,28 @@ proc gdb_file_cmd { arg } {
}
}
# The expect "spawn" function puts the tty name into the spawn_out
# array; but dejagnu doesn't export this globally. So, we have to
# wrap spawn with our own function and poke in the built-in spawn
# so that we can capture this value.
#
# If available, the TTY name is saved to the LAST_SPAWN_TTY_NAME global.
# Otherwise, LAST_SPAWN_TTY_NAME is unset.
proc spawn_capture_tty_name { args } {
set result [uplevel builtin_spawn $args]
upvar spawn_out spawn_out
if { [info exists spawn_out] } {
set ::last_spawn_tty_name $spawn_out(slave,name)
} else {
unset ::last_spawn_tty_name
}
return $result
}
rename spawn builtin_spawn
rename spawn_capture_tty_name spawn
# Default gdb_spawn procedure.
proc default_gdb_spawn { } {
@ -2074,6 +2097,7 @@ proc default_gdb_spawn { } {
}
set gdb_spawn_id $res
set ::gdb_tty_name $::last_spawn_tty_name
return 0
}
@ -7800,13 +7824,6 @@ proc with_override { name override body } {
# finalization function.
proc tuiterm_env { } {
load_lib tuiterm.exp
# Do initialization.
tuiterm_env_init
# Schedule finalization.
global gdb_finish_hooks
lappend gdb_finish_hooks tuiterm_env_finish
}
# Dejagnu has a version of note, but usage is not allowed outside of dejagnu.

View File

@ -15,36 +15,6 @@
# An ANSI terminal emulator for expect.
# The expect "spawn" function puts the tty name into the spawn_out
# array; but dejagnu doesn't export this globally. So, we have to
# wrap spawn with our own function, so that we can capture this value.
# The value is later used in calls to stty.
proc tuiterm_spawn { args } {
set result [uplevel builtin_spawn $args]
global gdb_spawn_name
upvar spawn_out spawn_out
if { [info exists spawn_out] } {
set gdb_spawn_name $spawn_out(slave,name)
} else {
unset gdb_spawn_name
}
return $result
}
# Initialize tuiterm.exp environment.
proc tuiterm_env_init { } {
# Override spawn with tui_spawn.
rename spawn builtin_spawn
rename tuiterm_spawn spawn
}
# Finalize tuiterm.exp environment.
proc tuiterm_env_finish { } {
# Restore spawn.
rename spawn tuiterm_spawn
rename builtin_spawn spawn
}
namespace eval Term {
# Size of the terminal.
variable _rows
@ -890,13 +860,12 @@ namespace eval Term {
variable _cols
variable _resize_count
global gdb_spawn_name
# expect handles each argument to stty separately. This means
# that gdb will see SIGWINCH twice. Rather than rely on this
# behavior (which, after all, could be changed), we make it
# explicit here. This also simplifies waiting for the redraw.
_do_resize $rows $_cols
stty rows $_rows < $gdb_spawn_name
stty rows $_rows < $::gdb_tty_name
# Due to the strange column resizing behavior, and because we
# don't care about this intermediate resize, we don't check
# the size here.
@ -906,7 +875,7 @@ namespace eval Term {
# than what we request from expect. We hide this weird
# details from the caller.
_do_resize $_rows $cols
stty columns [expr {$_cols + 1}] < $gdb_spawn_name
stty columns [expr {$_cols + 1}] < $::gdb_tty_name
wait_for "@@ resize done $_resize_count, size = ${_cols}x${rows}"
incr _resize_count
}