gdb/tui: Disassembler scrolling of very small programs
In TUI mode, if the disassembly output for the program is less than one screen long, then currently if the user scrolls down until on the last assembly instruction is displayed and then tries to scroll up using Page-Up, the display doesn't update - they are stuck viewing the last line. If the user tries to scroll up using the Up-Arrow, then the display scrolls normally. What is happening is on the Page-Up we ask GDB to scroll backward the same number of lines as the height of the TUI ASM window. The back scanner, which looks for a good place to start disassembling, fails to find a starting address which will provide the requested number of new lines before we get back to the original starting address (which is not surprising, our whole program contains less than a screen height of instructions), as a result the back scanner gives up and returns the original starting address. When we scroll with Up-Arrow we only ask the back scanner to find 1 new instruction, which it manages to do, so this scroll works. The solution here is, when we fail to find enough instructions, to return the lowest address we did manage to find. This will ensure we jump to the lowest possible address in the disassembly output. gdb/ChangeLog: PR tui/9765 * tui/tui-disasm.c (tui_find_disassembly_address): If we don't have enough lines to fill the screen, still return the lowest address we found. gdb/testsuite/ChangeLog: PR tui/9765 * gdb.tui/tui-layout-asm-short-prog.S: New file. * gdb.tui/tui-layout-asm-short-prog.exp: New file. Change-Id: I6a6a7972c68a0559e9717fd8d82870b669a40af3
This commit is contained in:
parent
7a27a45bc6
commit
42330a681a
5 changed files with 87 additions and 1 deletions
|
@ -1,3 +1,10 @@
|
|||
2020-01-31 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
PR tui/9765
|
||||
* tui/tui-disasm.c (tui_find_disassembly_address): If we don't
|
||||
have enough lines to fill the screen, still return the lowest
|
||||
address we found.
|
||||
|
||||
2020-01-31 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* tui/tui-win.c (_initialize_tui_win): Update help text for '+',
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2020-01-31 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
PR tui/9765
|
||||
* gdb.tui/tui-layout-asm-short-prog.S: New file.
|
||||
* gdb.tui/tui-layout-asm-short-prog.exp: New file.
|
||||
|
||||
2020-01-29 Luis Machado <luis.machado@linaro.org>
|
||||
|
||||
* gdb.arch/aarch64-brk-patterns.c: New source file.
|
||||
|
|
22
gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
Normal file
22
gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2020 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/>. */
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
.rept 5
|
||||
nop
|
||||
.endr
|
51
gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
Normal file
51
gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
Normal file
|
@ -0,0 +1,51 @@
|
|||
# Copyright 2020 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/>.
|
||||
|
||||
# Ensure that 'layout asm' can scroll away from the last line of a
|
||||
# very short program using a page up sized scroll.
|
||||
|
||||
load_lib "tuiterm.exp"
|
||||
|
||||
standard_testfile tui-layout-asm-short-prog.S
|
||||
|
||||
if {[build_executable "failed to prepare" ${testfile} ${srcfile} \
|
||||
{debug additional_flags=-nostdlib \
|
||||
additional_flags=-nostartfiles}] == -1} {
|
||||
return -1
|
||||
}
|
||||
|
||||
Term::clean_restart 24 80 $testfile
|
||||
if {![Term::prepare_for_tui]} {
|
||||
unsupported "TUI not supported"
|
||||
}
|
||||
|
||||
# This puts us into TUI mode, and should display the ASM window.
|
||||
Term::command "layout asm"
|
||||
Term::check_box_contents "check asm box contents" 0 0 80 15 "<_start>"
|
||||
|
||||
# Record the first line of output, we'll need this later.
|
||||
set first_line [Term::get_line 1]
|
||||
|
||||
# Scroll forward a large amount, this should take us to the last
|
||||
# instruction in the program.
|
||||
Term::command "+ 13"
|
||||
Term::check_box_contents "check asm box contents again" 0 0 80 15 \
|
||||
"^ *$hex\[^\n\]+\n +\n"
|
||||
|
||||
# Now scroll backward again, we should return to the start of the
|
||||
# program.
|
||||
Term::command "- 13"
|
||||
gdb_assert {[string eq "$first_line" [Term::get_line 1]]} \
|
||||
"check first line is back"
|
|
@ -268,7 +268,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
|
|||
if (asm_lines.size () < max_lines)
|
||||
{
|
||||
if (!possible_new_low.has_value ())
|
||||
return pc;
|
||||
return new_low;
|
||||
|
||||
/* Take the best possible match we have. */
|
||||
new_low = *possible_new_low;
|
||||
|
|
Loading…
Add table
Reference in a new issue