gdb: use tui_set_layout not show_layout to fix window focus

When calling tui_add_win_to_layout, use tui_set_layout not show_layout
so that window focus is correctly updated.  If the focus is not
correctly maintained then GDB can be crashed like this:

  start
  tui enable
  layout asm
  list SOME_FUNCTION

At this point GDB will have "popped up" the source window to
display SOME_FUNCTION.  Previously no window would have focus at this
point, and so if the user now does 'focus next' or 'focus prev', then
GDB would crash.

Calling tui_set_layout ensures that focus is correctly calculated as
the source window is "popped up", and this fixes the issue.

gdb/ChangeLog:

	* tui/tui-layout.c (tui_add_win_to_layout): Use tui_set_layout not
	show_layout.

gdb/testsuite/ChangeLog:

	* gdb.tui/list.exp: Test 'focus next' after 'list main'.

Change-Id: Id0b13f99b0e889261efedfd0adabe82020202f44
This commit is contained in:
Andrew Burgess 2019-12-22 23:45:31 +00:00
parent 6a5206eb27
commit f2302a34f2
4 changed files with 18 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2020-01-05 Andrew Burgess <andrew.burgess@embecosm.com>
* tui/tui-layout.c (tui_add_win_to_layout): Use tui_set_layout not
show_layout.
2020-01-05 Luis Machado <luis.machado@linaro.org>
* aarch64-linux-nat.c

View File

@ -1,3 +1,7 @@
2020-01-05 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.tui/list.exp: Test 'focus next' after 'list main'.
2020-01-03 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.base/style.exp: Test that warnings are styled.

View File

@ -35,3 +35,6 @@ Term::check_contents "asm window shows main" "$hex <main>"
Term::command "list main"
Term::check_contents "list main" "21 *return 0"
# The following 'focus next' must be immediately after 'list main' to
# ensure that GDB has a valid idea of what is currently focused.
Term::command "focus next"

View File

@ -201,9 +201,9 @@ tui_add_win_to_layout (enum tui_win_type type)
&& cur_layout != SRC_DATA_COMMAND)
{
if (cur_layout == DISASSEM_DATA_COMMAND)
show_layout (SRC_DATA_COMMAND);
tui_set_layout (SRC_DATA_COMMAND);
else
show_layout (SRC_COMMAND);
tui_set_layout (SRC_COMMAND);
}
break;
case DISASSEM_WIN:
@ -212,9 +212,9 @@ tui_add_win_to_layout (enum tui_win_type type)
&& cur_layout != DISASSEM_DATA_COMMAND)
{
if (cur_layout == SRC_DATA_COMMAND)
show_layout (DISASSEM_DATA_COMMAND);
tui_set_layout (DISASSEM_DATA_COMMAND);
else
show_layout (DISASSEM_COMMAND);
tui_set_layout (DISASSEM_COMMAND);
}
break;
case DATA_WIN:
@ -222,9 +222,9 @@ tui_add_win_to_layout (enum tui_win_type type)
&& cur_layout != DISASSEM_DATA_COMMAND)
{
if (cur_layout == DISASSEM_COMMAND)
show_layout (DISASSEM_DATA_COMMAND);
tui_set_layout (DISASSEM_DATA_COMMAND);
else
show_layout (SRC_DATA_COMMAND);
tui_set_layout (SRC_DATA_COMMAND);
}
break;
default: