aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.tui
AgeCommit message (Collapse)AuthorFilesLines
2021-12-07[gdb/testsuite] Fix FAIL in gdb.tui/basic.expTom de Vries2-14/+50
On openSUSE Leap 15.2 aarch64 I ran into: ... FAIL: gdb.tui/basic.exp: check main is where we expect on the screen ... while this is passing on x86_64. On x86_64-linux we have at the initial screen dump for "list -q main": ... 0 +-/home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.tui/tui-layout.c--+ 1 | 15 You should have received a copy of the GNU General Public | 2 | 16 along with this program. If not, see <http://www.gnu.org/| 3 | 17 | 4 | 18 int | 5 | 19 main () | 6 | 20 { | 7 | 21 return 0; | 8 | 22 } | 9 | 23 | ... but on aarch64: ... 0 +-/home/tdevries/gdb/src/gdb/testsuite/gdb.tui/tui-layout.c--------------+ 1 | 16 along with this program. If not, see <http://www.gnu.org/| 2 | 17 | 3 | 18 int | 4 | 19 main () | 5 | 20 { | 6 | 21 return 0; | 7 | 22 } | 8 | 23 | 9 | 24 | ... The cause of the diffferent placement is that we have as line number for main on x86_64: ... $ gdb -q -batch outputs/gdb.tui/basic/basic -ex "info line main" Line 20 of "tui-layout.c" starts at address 0x4004a7 <main> \ and ends at 0x4004ab <main+4>. ... and on aarch64 instead: ... $ gdb -q -batch outputs/gdb.tui/basic/basic -ex "info line main" Line 21 of "tui-layout.c" starts at address 0x4005f4 <main> \ and ends at 0x4005f8 <main+4>. ... Fix this by using a new source file main-one-line.c, that implements the entire main function on a single line, in order to force the compiler to use that line number. Also try to do less hard-coding in the test-case. Tested on x86_64-linux and aarch64-linux.
2021-10-21[gdb/tui] Fix breakpoint display functionalityTom de Vries1-0/+37
In commit 81e6b8eb208 "Make tui-winsource not use breakpoint_chain", a loop body was transformed into a lambda function body: ... - for (bp = breakpoint_chain; - bp != NULL; - bp = bp->next) + iterate_over_breakpoints ([&] (breakpoint *bp) -> bool ... and consequently: - a continue was replaced by a return, and - a final return was added. Then in commit 240edef62f0 "gdb: remove iterate_over_breakpoints function", we transformed back to a loop body: ... - iterate_over_breakpoints ([&] (breakpoint *bp) -> bool + for (breakpoint *bp : all_breakpoints ()) ... but without reverting the changes that introduced the two returns. Consequently, breakpoints no longer show up in the tui source window. Fix this by reverting the changes that introduced the two returns. Build on x86_64-linux, tested with all .exp test-cases that contain tuiterm_env. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28483
2021-10-13[gdb/testsuite] Require use_gdb_stub == 0 where appropriateTom de Vries1-0/+3
When running with target board native-gdbserver, we run into a number of FAILs due to use of the start command (and similar), which is not supported when use_gdb_stub == 1. Fix this by: - requiring use_gdb_stub == 0 for the entire test-case, or - guarding some tests in the test-case with use_gdb_stub == 0. Tested on x86_64-linux.
2021-10-06[gdb/testsuite] Fix FAIL in gdb.tui/corefile-run.expTom de Vries1-1/+1
When running test-case gdb.tui/corefile-run.exp on openSUSE Tumbleweed, I run into: ... PASS: gdb.tui/corefile-run.exp: load corefile FAIL: gdb.tui/corefile-run.exp: run until the end ... What's going on is easier to see when also doing dump_screen if check_contents passes, and inspecting state at the preceding PASS: ... +-------------------------------------------------------------------------+ exec No process In: L?? PC: ?? [New LWP 16629] [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". Core was generated by `/data/gdb_versions/devel/build/gdb/testsuite/output s/gdb.tui/corefile-run/corefi'. Program terminated with signal SIGTRAP, Trace/breakpoint trap. #0 main () --Type <RET> for more, q to quit, c to continue without paging-- ... The problem is that we're getting a pagination prompt, and the subsequent run command is interpreted as an answer to that prompt. Fix this by: - detecting the gdb prompt in response to "load corefile", such that we detect the failure earlier, and - doing a "set pagination off" in Term::clean_restart. Tested on x86_64-linux.
2021-09-30gdb/testsuite: make runto_main not pass no-message to runtoSimon Marchi2-2/+0
As follow-up to this discussion: https://sourceware.org/pipermail/gdb-patches/2020-August/171385.html ... make runto_main not pass no-message to runto. This means that if we fail to run to main, for some reason, we'll emit a FAIL. This is the behavior we want the majority of (if not all) the time. Without this, we rely on tests logging a failure if runto_main fails, otherwise. They do so in a very inconsisteny mannet, sometimes using "fail", "unsupported" or "untested". The messages also vary widly. This patch removes all these messages as well. Also, remove a few "fail" where we call runto (and not runto_main). by default (without an explicit no-message argument), runto prints a failure already. In two places, gdb.multi/multi-re-run.exp and gdb.python/py-pp-registration.exp, remove "message" passed to runto. This removes a few PASSes that we don't care about (but FAILs will still be printed if we fail to run to where we want to). This aligns their behavior with the rest of the testsuite. Change-Id: Ib763c98c5f4fb6898886b635210d7c34bd4b9023
2021-07-29Fix for gdb.tui/tui-layout-asm.expCarl Love1-2/+30
The width of the window is too narrow to display the entire assembly line. The width of the columns in the window changes as the test walks thru the terminal window output. The column change results in the first and second reads of the same line to differ thus causing the test to fail. Increasing the width of the window keeps the column width consistent thru the test. If the test fails, the added check prints an message to the log file if the failure may be due to the window being too narrow. gdb/testsuite/ChangeLog * gdb.tui/tui-layout-asm.exp: Replace window width of 80 with the tui_asm_window_width variable for the width. Add if count_whitespace check. (count_whitespace): New proc
2021-02-08gdb/tui: don't add windows to global list from tui_layout:window::applyAndrew Burgess1-0/+14
This commit was inspired by this mailing list patch: https://sourceware.org/pipermail/gdb-patches/2021-January/174713.html Currently, calling tui_layout_window::apply will add the window from the layout object to the global tui_windows list. Unfortunately, when the user runs the 'winheight' command, this calls tui_adjust_window_height, which calls the tui_layout_base::adjust_size function, which can then call tui_layout_base::apply. The consequence of this is that when the user does 'winheight' duplicate copies of a window can be added to the global tui_windows list. The original patch fixed this by changing the apply function to only update the global list some of the time. This patch takes a different approach. The apply function no longer updates the global tui_windows list. Instead a new virtual function is added to tui_layout_base which is used to gather all the currently applied windows into a vector. Finally tui_apply_current_layout is updated to make use of this new function to update the tui_windows list. The benefits I see in this approach are, (a) the apply function now no longer touches global state, this solves the immediate problem, and (b) now that tui_windows is updated directly in the function tui_apply_current_layout, we can drop the saved_tui_windows global. gdb/ChangeLog: * tui-layout.c (saved_tui_windows): Delete. (tui_apply_current_layout): Don't make use of saved_tui_windows, call new get_windows member function instead. (tui_get_window_by_name): Check in tui_windows. (tui_layout_window::apply): Don't add to tui_windows. * tui-layout.h (tui_layout_base::get_windows): New member function. (tui_layout_window::get_windows): Likewise. (tui_layout_split::get_windows): Likewise. gdb/testsuite/ChangeLog: * gdb.tui/winheight.exp: Add more tests.
2021-02-08gdb/tui: fix issue with handling the return characterAndrew Burgess1-19/+29
My initial goal was to fix our gdb/testsuite/lib/tuiterm.exp such that it would correctly support (some limited) scrolling of the command window. What I observe is that when sending commands to the tui command window in a test script with: Term::command "p 1" The command window would be left looking like this: (gdb) (gdb) p 1$1 = 1 (gdb) When I would have expected it to look like this: (gdb) p 1 $1 = 1 (gdb) Obviously a bug in our tuiterm.exp library, right??? Wrong! Turns out there's a bug in GDB. If in GDB I enable the tui and then type (slowly) the 'p 1\r' (the \r is pressing the return key at the end of the string), then you do indeed get the "expected" terminal output. However, if instead I copy the 'p 1\r' string and paste it into the tui in one go then I now see the same corrupted output as we do when using tuiterm.exp. It turns out the problem is that GDB fails when handling lots of input arriving quickly with a \r (or \n) on the end. The reason for this bug is as follows: When the tui is active the terminal is in no-echo mode, so characters sent to the terminal are not echoed out again. This means that when the user types \r, this is not echoed to the terminal. The characters read in are passed to readline and \r indicates that the command line is complete and ready to be processed. However, the \r is not included in readlines command buffer, and is NOT printed by readline when is displays its buffer to the screen. So, in GDB we have to manually spot the \r when it is read in and update the display. Printing a newline character to the output and moving the cursor to the next line. This is done in tui_getc_1. Now readline tries to reduce the number of write calls. So if we very quickly (as in paste in one go) the text 'p 1' to readline (this time with no \r on the end), then readline will fetch the fist character and add it to its internal buffer. But before printing the character out readline checks to see if there's more input incoming. As we pasted multiple characters, then yes, readline sees the ' ' and adds this to its buffer, and finally the '1', this too is added to the buffer. Now if at this point we take a break, readline sees there is no more input available, and so prints its buffer out. Now when we press \r the code in tui_getc_1 kicks in, adds a \n to the output and moves the cursor to the next line. But, if instead we paste 'p 1\r' in one go then readline adds 'p 1' to its buffer as before, but now it sees that there is still more input available. Now it fetches the '\r', but this triggers the newline behaviour, we print '\n' and move to the next line - however readline has not printed its buffer yet! So finally we end up on the next line. There's no more input available so readline prints its buffer, then GDB gets passed the buffer, handles it, and prints the result. The solution I think is to put of our special newline insertion code until we know that readline has finished printing its buffer. Handily we know when this is - the next thing readline does is pass us the command line buffer for processing. So all we need to do is hook in to the command line processing, and before we pass the command line to GDB's internals we do all of the magic print a newline and move the cursor to the next line stuff. Luckily, GDB's interpreter mechanism already provides the hooks we need to do this. So all I do here is move the newline printing code from tui_getc_1 into a new function, setup a new input_handler hook for the tui, and call my new newline printing function. After this I can enable the tui and paste in 'p 1\r' and see the correct output. Also the tuiterm.exp library will now see non-corrupted output. gdb/ChangeLog: * tui/tui-interp.c (tui_command_line_handler): New function. (tui_interp::resume): Register tui_command_line_handler as the input_handler. * tui/tui-io.c (tui_inject_newline_into_command_window): New function. (tui_getc_1): Delete handling of '\n' and '\r'. * tui-io.h (tui_inject_newline_into_command_window): Declare. gdb/testsuite/ChangeLog: * gdb.tui/scroll.exp: Tighten expected results. Remove comment about bug in GDB, update expected results, and add more tests.
2021-02-08gdb/testsuite: fix implementation of delete line in tuiterm.expAndrew Burgess2-1/+65
The implementation of the delete line escape sequence in tuiterm.exp was wrong. Delete should take a count and then delete COUNT lines at the current cursor location, all remaining lines in the scroll region are moved up to replace the deleted lines, with blank lines being added at the end of the scroll region. It's not clear to me what "scroll region" means here (or at least how that is defined), but for now I'm just treating the whole screen as the scroll region, which seems to work fine. In contrast the current broken implementation deletes COUNT lines at the cursor location moving the next COUNT lines up to fill the gap. The rest of the screen is then cleared. gdb/testsuite/ChangeLog: * gdb.tui/scroll.exp: New file. * gdb.tui/tui-layout-asm-short-prog.exp: Update expected results. * lib/tuiterm.exp (Term::_csi_M): Delete count lines, scroll remaining lines up. (Term::check_region_contents): New proc. (Term::check_box_contents): Use check_region_contents.
2021-02-06[gdb/testsuite] Fix gdb.tui/tui-layout-asm.exp with -m32Tom de Vries1-2/+5
When running test-case gdb.tui/tui-layout-asm.exp with target board unix/-m32, we run into: ... FAIL: gdb.tui/tui-layout-asm.exp: scroll to end of assembler (scroll failed) ... Comparing screen dumps (edited a bit to fit column width) before: ... 0 +--------------------------------------------------------------------+ 1 | 0x8049194 <__libc_csu_init+68> call *-0x104(%ebp,%esi,4) | 2 | 0x804919b <__libc_csu_init+75> add $0x1,%esi | 3 | 0x804919e <__libc_csu_init+78> add $0x10,%esp | 4 | 0x80491a1 <__libc_csu_init+81> cmp %esi,%ebx | 5 | 0x80491a3 <__libc_csu_init+83> jne 0x8049188 <__...> | 6 | 0x80491a5 <__libc_csu_init+85> add $0xc,%esp | 7 | 0x80491a8 <__libc_csu_init+88> pop %ebx | 8 | 0x80491a9 <__libc_csu_init+89> pop %esi | 9 | 0x80491aa <__libc_csu_init+90> pop %edi | 10 | 0x80491ab <__libc_csu_init+91> pop %ebp | 11 | 0x80491ac <__libc_csu_init+92> ret | 12 | 0x80491ad lea 0x0(%esi),%esi | 13 | 0x80491b0 <__libc_csu_fini> ret | 14 +--------------------------------------------------------------------+ ... and after: ... 0 +--------------------------------------------------------------------+ 1 | 0x804919b <__libc_csu_init+75> add $0x1,%esi | 2 | 0x804919e <__libc_csu_init+78> add $0x10,%esp | 3 | 0x80491a1 <__libc_csu_init+81> cmp %esi,%ebx | 4 | 0x80491a3 <__libc_csu_init+83> jne 0x8049188 <__...> | 5 | 0x80491a5 <__libc_csu_init+85> add $0xc,%esp | 6 | 0x80491a8 <__libc_csu_init+88> pop %ebx | 7 | 0x80491a9 <__libc_csu_init+89> pop %esi | 8 | 0x80491aa <__libc_csu_init+90> pop %edi | 9 | 0x80491ab <__libc_csu_init+91> pop %ebp | 10 | 0x80491ac <__libc_csu_init+92> ret | 11 | 0x80491ad lea 0x0(%esi),%esi | 12 | 0x80491b0 <__libc_csu_fini> ret | 13 | 0x80491b1 <__x86.get_pc_thunk.bp> mov (%esp),%ebp | 14 +--------------------------------------------------------------------+ ... it seems the mismatch comes from the extra indentation forced by the longer <__x86.get_pc_thunk.bp> that was scrolled in. Fix this by ignoring whitespace when comparing scrolled lines. Tested on x86_64-linux, using -m64 and -m32. gdb/testsuite/ChangeLog: 2021-02-06 Tom de Vries <tdevries@suse.de> PR testsuite/26922 * gdb.tui/tui-layout-asm.exp: Ignore whitespace mismatches when scrolling.
2021-01-01Update copyright year range in all GDB filesJoel Brobecker20-20/+20
This commits the result of running gdb/copyright.py as per our Start of New Year procedure... gdb/ChangeLog Update copyright year range in copyright header of all GDB files.
2020-12-10[gdb/testsuite] Fix gdb.tui/new-layout.exp with tcl 8.5Tom de Vries1-6/+10
In commit 4d91ddd342 "[gdb/testsuite] Fix unbalanced braces in gdb.tui/new-layout.exp", I tried to fix a problem with test-case gdb.tui/new-layout.exp when running with tcl 8.5. However, at that point I only had access to the log containing the failure, and unfortunately my patch turned out not to be effective. So, finally fix this problem by guarding the problematic code with: ... if { [tcl_version_at_least 8 6] } { ... } ... Tested on x86_64-linux, specifically SLE-11 where I ran into the failure. gdb/testsuite/ChangeLog: 2020-12-10 Tom de Vries <tdevries@suse.de> PR testsuite/26947 * gdb.tui/new-layout.exp: Don't execute tests with unbalanced curly braces for tcl 8.5 and earlier.
2020-10-19Don't erase TUI source window when switching focusTom Tromey1-0/+2
PR tui/26719 points out that switching the focus can erase the TUI source window. This is a regression introduced by the patch to switch the source window to using a pad. This patch fixes the bug by arranging to call prefresh whenever the window is refreshed. 2020-10-19 Tom Tromey <tromey@adacore.com> PR tui/26719 * tui/tui-winsource.h (struct tui_source_window_base) <refresh_window>: Rename from refresh_pad. * tui/tui-winsource.c (tui_source_window_base::refresh_window): Rename from refresh_pad. (tui_source_window_base::show_source_content) (tui_source_window_base::do_scroll_horizontal): Update. gdb/testsuite/ChangeLog 2020-10-19 Tom Tromey <tromey@adacore.com> PR tui/26719 * gdb.tui/list.exp: Check source window contents after focus change.
2020-10-13gdb/testsuite/: Use "-qualified" in explicit "break main", etc.Pedro Alves3-7/+7
Similar to the previous patch, but this time add "-q" to tests that do "break main", "list main", etc. explicitly. gdb/testsuite/ChangeLog: * config/monitor.exp: Use "list -q". * gdb.arch/gdb1558.exp: Use "break -q". * gdb.arch/i386-permbkpt.exp: Use "break -q". * gdb.arch/i386-prologue-skip-cf-protection.exp: Use "break -q". * gdb.base/break.exp: Use "break -q", "list -q" and "tbreak -q". * gdb.base/commands.exp: Use "break -q". * gdb.base/condbreak.exp: Use "break -q". * gdb.base/ctf-ptype.exp: Use "list -q". * gdb.base/define.exp: Use "break -q". * gdb.base/del.exp: Use "break -q". * gdb.base/fullname.exp: Use "break -q". * gdb.base/hbreak-in-shr-unsupported.exp: Use "hbreak -q". * gdb.base/hbreak-unmapped.exp: Use "hbreak -q". * gdb.base/hbreak2.exp: Use "hbreak -q" and "list -q". * gdb.base/hw-sw-break-same-address.exp: Use "break -q" and "hbreak -q". * gdb.base/included.exp: Use "list -q". * gdb.base/label.exp: Use "break -q". * gdb.base/lineinc.exp: Use "break -q". * gdb.base/list.exp: Use "list -q". * gdb.base/macscp.exp: Use "list -q". * gdb.base/pending.exp: Use "break -q". * gdb.base/prologue-include.exp: Use "break -q". * gdb.base/ptype.exp: Use "list -q". * gdb.base/sepdebug.exp: Use "break -q", "list -q" and "tbreak -q". * gdb.base/server-del-break.exp: Use "break -q". * gdb.base/style.exp: Use "break -q". * gdb.base/symbol-without-target_section.exp: Use "list -q". * gdb.base/watchpoint-reuse-slot.exp: Use "hbreak -q". * gdb.cp/exception.exp: Use "tbreak -q". * gdb.dwarf2/dw2-error.exp: Use "break -q". * gdb.dwarf2/fission-mix.exp: Use "break -q". * gdb.dwarf2/fission-reread.exp: Use "break -q". * gdb.dwarf2/pr13961.exp: Use "break -q". * gdb.linespec/explicit.exp: Use "list -q". * gdb.linespec/linespec.exp: Use "break -q". * gdb.mi/mi-simplerun.exp: Use "--qualified". * gdb.python/py-mi-objfile-gdb.py: Use "list -q". * gdb.server/bkpt-other-inferior.exp: Use "break -q". * gdb.server/connect-without-multi-process.exp: Use "break -q". * gdb.trace/change-loc.exp: Use "break -q". * gdb.trace/pending.exp: Use "break -q". * gdb.tui/basic.exp: Use "list -q". * gdb.tui/list-before.exp: Use "list -q". * gdb.tui/list.exp: Use "list -q". * lib/gdb.exp (gdb_has_argv0): Use "break -q". Change-Id: Iab9408e90ed71cbb111cd737d2d81b5ba8adb108
2020-09-27Remove test duplicate from gdb.tuiTom Tromey1-4/+6
I noticed a duplicated test in gdb.tui. This patch removes it by wrapping a test in with_test_prefix. gdb/testsuite/ChangeLog 2020-09-27 Tom Tromey <tom@tromey.com> * gdb.tui/new-layout.exp: Use with_test_prefix.
2020-09-24Don't let TUI focus on locatorTom Tromey1-0/+1
PR tui/26638 notes that the C-x o binding can put the focus on the locator window. However, this is not useful and did not happen historically. This patch changes the TUI to skip this window when switching focus. gdb/ChangeLog 2020-09-24 Tom Tromey <tromey@adacore.com> PR tui/26638: * tui/tui-stack.h (struct tui_locator_window) <can_focus>: New method. * tui/tui-data.h (struct tui_win_info) <can_focus>: New method. * tui/tui-data.c (tui_next_win): Exclude non-focusable windows. (tui_prev_win): Rewrite. gdb/testsuite/ChangeLog 2020-09-24 Tom Tromey <tromey@adacore.com> PR tui/26638: * gdb.tui/list.exp: Check output of "focus next".
2020-09-16[gdb/testsuite] Fix unbalanced braces in gdb.tui/new-layout.expTom de Vries1-6/+6
On SLE-11 with tcl version 8.5, we run into: ... UNRESOLVED: gdb.tui/new-layout.exp: testcase aborted due to \ invalid command name: } ERROR: Couldn't send tui new-layout example src 1} to GDB. ... Apparently tcl 8.6 is more forgiving about unbalanced braces. Expose the unbalanced braces on tcl 8.6 by temporarily wrapping the test-case in: ... proc do_this { args } { uplevel 1 {*}$args } do_this { ... } ... and escape them using a backslash. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-09-16 Tom de Vries <tdevries@suse.de> PR testsuite/26618 * gdb.tui/new-layout.exp: Escape unbalanced braces.
2020-06-17Fix TUI support checks in gdb.tui tests.Sandra Loosemore13-0/+20
2020-06-17 Sandra Loosemore <sandra@codesourcery.com> gdb/testsuite/ * gdb.tui/basic.exp: Skip test when TUI is unsupported, don't just say UNSUPPORTED. * gdb.tui/corefile-run.exp: Likewise. * gdb.tui/empty.exp: Likewise. * gdb.tui/list-before.exp: Likewise. * gdb.tui/list.exp: Likewise. * gdb.tui/main.exp: Likewise. * gdb.tui/regs.exp: Likewise. * gdb.tui/resize.exp: Likewise. * gdb.tui/tui-layout-asm-short-prog.exp: Likewise. * gdb.tui/tui-layout-asm.exp: Likewise. * gdb.tui/tui-missing-src.exp: Likewise. * gdb.tui/winheight.exp: Likewise. * gdb.tui/new-layout.exp: Likewise. Also move check earlier.
2020-06-12[gdb/testsuite] Don't leak tuiterm.exp spawn overrideTom de Vries13-13/+13
In lib/tuiterm.exp the builtin spawn is overridden by a tui-specific version. After running the first test-case that imports tuiterm.exp, the override remains active, so it can cause trouble in subsequent test-cases, even if they do not import tuiterm.exp. See f.i. commit c8d4f6dfd9 "[gdb/testsuite] Fix spawn in tuiterm.exp". Fix this by: - adding a variable gdb_finish_hooks which is a list of procs to run during gdb_finish - adding a proc tuiterm_env that is used in test-cases instead of "load_lib tuiterm.exp". - letting tuiterm_env: - install the tui-specific spawn version, and - use the gdb_finish_hooks to schedule restoring the builtin spawn version. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-06-12 Tom de Vries <tdevries@suse.de> * lib/tuiterm.exp (spawn): Rename to ... (tui_spawn): ... this. (toplevel): Move rename of spawn ... (gdb_init_tuiterm): ... here. New proc. (gdb_finish_tuiterm): New proc. * lib/gdb.exp (gdb_finish_hooks): New global var. (gdb_finish): Handle gdb_finish_hooks. (tuiterm_env): New proc. * gdb.python/tui-window.exp: Replace load_lib tuiterm.exp with tuiterm_env. * gdb.tui/basic.exp: Same. * gdb.tui/corefile-run.exp: Same. * gdb.tui/empty.exp: Same. * gdb.tui/list-before.exp: Same. * gdb.tui/list.exp: Same. * gdb.tui/main.exp: Same. * gdb.tui/new-layout.exp: Same. * gdb.tui/regs.exp: Same. * gdb.tui/resize.exp: Same. * gdb.tui/tui-layout-asm-short-prog.exp: Same. * gdb.tui/tui-layout-asm.exp: Same. * gdb.tui/tui-missing-src.exp: Same. * gdb.tui/winheight.exp: Same.
2020-03-13[gdb/testsuite] Fix check-read1 FAIL in gdb.tui/corefile-run.expTom de Vries2-2/+2
With test-case gdb.tui/corefile-run.exp and make target check-read1, I run into: ... FAIL: gdb.tui/corefile-run.exp: run until the end ... In more detail, using -v: ... PASS: gdb.tui/corefile-run.exp: load corefile ^M+++ _ctl_0x0d ^[[17d+++ _csi_d <<<17>>> ^[[M+++ _csi_M <<<>>> ^[[24d+++ _csi_d <<<24>>> (INSERT <<(>> gINSERT <<g>> dINSERT <<d>> bINSERT <<b>> )INSERT <<)>> INSERT << >> FAIL: gdb.tui/corefile-run.exp: run until the end ... With some debugging code added in wait_for, what happens becomes more clear: ... if {[regexp -- $wait_for $prev]} { + verbose -log "\nwait_for: MATCHED line ($_cur_y): \"$prev\"" + verbose -log "wait_for: AGAINST regexp: \"$wait_for\"" ... In corefile-run.exp, we execute: ... Term::command "run" ... and in proc Term::command, we send the command, and then call wait_for: ... proc command {cmd} { send_gdb "$cmd\n" wait_for [string_to_regexp $cmd] } ... which first waits for the command string, and then for the prompt. In this case however, the matching of the command string triggers on a previous line: ... wait_for: MATCHED line (16): \ "(gdb) core-file corefile-run.core[New LWP 6426] <lots-of-spaces>" wait_for: AGAINST regexp: "run" ... and from there on things go out of sync, eventually resulting in the FAIL. Fix this in proc command by more precisely specifying the expected pattern: adding a ^$gdb_prompt prefix. Add a command_no_prompt_prefix variant to use for initial terminal commands where there's no prompt yet. Tested gdb.tui/*.exp on x86_64-linux, with make target check and check-read1. gdb/testsuite/ChangeLog: 2020-03-13 Tom de Vries <tdevries@suse.de> * lib/tuiterm.exp (Term::command_no_prompt_prefix): New proc. (Term::command): Use prompt prefix. (Term::enter_tui): Use command_no_prompt_prefix instead of prefix. * gdb.tui/tui-layout-asm-short-prog.exp: Use command_no_prompt_prefix instead of prefix. * gdb.tui/tui-layout-asm.exp: Same.
2020-02-22Add horizontal splitting to TUI layoutTom Tromey1-1/+20
This changes the TUI layout engine to add horizontal splitting. Now, windows can be side-by-side. A horizontal split is defined using the "-horizontal" parameter to "tui new-layout". This also adds the first "winheight" test to the test suite. One open question is whether we want a new "winwidth" command, now that horizontal layouts are possible. This is easily done using the generic layout code. gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * tui/tui-win.c (tui_gen_win_info::max_width): New method. * tui/tui-layout.h (class tui_layout_base) <get_sizes>: Add "height" argument. (class tui_layout_window) <get_sizes>: Likewise. (class tui_layout_split) <tui_layout_split>: Add "vertical" argument. <get_sizes>: Add "height" argument. <m_vertical>: New field. * tui/tui-layout.c (tui_layout_split::clone): Update. (tui_layout_split::get_sizes): Add "height" argument. (tui_layout_split::adjust_size, tui_layout_split::apply): Update. (tui_new_layout_command): Parse "-horizontal". (_initialize_tui_layout): Update help string. (tui_layout_split::specification): Add "-horizontal" when needed. * tui/tui-layout.c (tui_layout_window::get_sizes): Add "height" argument. * tui/tui-data.h (struct tui_gen_win_info) <max_width, min_width>: New methods. gdb/doc/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * gdb.texinfo (TUI Commands): Document horizontal layouts. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> PR tui/17850: * gdb.tui/new-layout.exp: Add horizontal layout and winheight tests. Change-Id: I38b35e504f34698578af86686be03c0fefd954ae
2020-02-22Allow TUI sub-layouts in "new-layout" commandTom Tromey1-0/+11
The new TUI layout engine has support for "sub-layouts" -- this is a layout that includes another layout as a child. A sub-layout is treated as a unit when allocating space. There's not a very strong reason to use sub-layouts currently. This patch exists to introduce the idea, and to simplify the subsequent patch that adds horizontal layouts -- where sub-layouts are needed. Because this patch won't go in on its own, I chose to defer documenting this change until the subsequent horizontal layout patch. gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * tui/tui-layout.h (class tui_layout_split) <add_split>: Change parameter and return types. (class tui_layout_base) <specification>: Add "depth". (class tui_layout_window) <specification>: Add "depth". (class tui_layout_split) <specification>: Add "depth". * tui/tui-layout.c (tui_layout_split::add_split): Change parameter and return types. (tui_new_layout_command): Parse sub-layouts. (_initialize_tui_layout): Update help string. (tui_layout_window::specification): Add "depth". (add_layout_command): Update. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.tui/new-layout.exp: Add sub-layout tests. Change-Id: Iddf52d067a552c168b8a67f29caf7ac86404b10c
2020-02-22Add the "tui new-layout" commandTom Tromey1-0/+54
This adds a new command, "tui new-layout". This command can be used to define a new TUI window layout. The command is used like: (gdb) tui new-layout name src 1 regs 1 status 0 cmd 1 The first argument is the name of the layout. In this example, it is "name", so the new layout could be seen by "layout name". Subsequent arguments come in pairs, where the first item in a pair is the name of a window, and the second item in a pair is the window's weight. A weight is just an integer -- a window's allocated size is proportional to the total of the weights given. So, in the above example, all windows will have the same size (the status windows's weight does not matter, because it has fixed height). gdb/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * NEWS: Add "tui new-layout" item. * tui/tui-layout.c (add_layout_command): Return cmd_list_element. Add new-layout command to help text. (validate_window_name): New function. (tui_new_layout_command): New function. (_initialize_tui_layout): Register "new-layout". (tui_layout_window::specification): New method. (tui_layout_window::specification): New method. * tui/tui-layout.h (class tui_layout_base) <specification>: New method. (class tui_layout_window) <specification>: New method. (class tui_layout_split) <specification>: New method. gdb/doc/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.texinfo (TUI Overview): Mention user layouts. (TUI Commands): Document "tui new-layout". gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey <tom@tromey.com> * gdb.tui/new-layout.exp: New file. Change-Id: Id7c3ace20ab1e8924f8f4ad788f40210f58a5c05
2020-02-06gdb: Catch exceptions if the source file is not foundShahab Vahedi1-0/+97
The source_cache::ensure method may throw an exception through the invocation of source_cache::get_plain_source_lines. This happens when the source file is not found. The expected behaviour of "ensure" is only returning "true" or "false" according to the documentation in the header file. So far, if gdb is in source layout and a file is missing, you see some outputs like below: ,---------------------------------------------. | test.c file is loaded in the source window. | | | | int main() | | ... | |---------------------------------------------| | Remote debugging using :1234 | | __start () at /path/to/crt0.S:141 | | /path/to/crt0.S: No such file or directory. | | (gdb) p/x $pc | | $1 = 0x124 | | (gdb) n | | /path/to/crt0.S: No such file or directory. | | (gdb) p/x $pc | | $2 = 0x128 | | (gdb) [pressing arrow-down key] | | (gdb) terminate called after throwing an | | instance of 'gdb_exception_error' | `---------------------------------------------' Other issues have been encountered as well [1]. The patch from Pedro [2] which is about preventing exceptions from crossing the "readline" mitigates the situation by not causing gdb crash, but still there are lots of errors printed: ,---------------------------------------------. | test.c file is loaded in the source window. | | | | int main() | | ... | |---------------------------------------------| | Remote debugging using :1234 | | __start () at /path/to/crt0.S:141 | | /path/to/crt0.S: No such file or directory. | | (gdb) [pressing arrow-down key] | | /path/to/crt0.S: No such file or directory. | | (gdb) [pressing arrow-down key] | | /path/to/crt0.S: No such file or directory. | | (gdb) [pressing arrow-up key] | | /path/to/crt0.S: No such file or directory. | `---------------------------------------------' With the changes of this patch, the behavior is like: ,---------------------------------------------. | initially, source window is empty because | | crt0.S is not found and according to the | | program counter that is the piece of code | | being executed. | | | | later, when we break at main (see commands | | below), this window will be filled with the | | the contents of test.c file. | |---------------------------------------------| | Remote debugging using :1234 | | __start () at /path/to/crt0.S:141 | | (gdb) p/x $pc | | $1 = 0x124 | | (gdb) n | | (gdb) p/x $pc | | $2 = 0x128 | | (gdb) b main | | Breakpoint 1 at 0x334: file test.c, line 8. | | (gdb) cont | | Continuing. | | Breakpoint 1, main () at hello.c:8 | | (gdb) n | | (gdb) | `---------------------------------------------' There is no crash and the error message is completely gone. Maybe it is good practice that the error is shown inside the source window. I tested this change against gdb.base/list-missing-source.exp and there was no regression. [1] It has also been observed in the past that the register values are not transferred from qemu's gdb stub, see: https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/issues/226 [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=2f267673f0fdee9287e6d404ecd4f2d29da0d2f2 gdb/ChangeLog: * source-cache.c (source_cache::ensure): Surround get_plain_source_lines with a try/catch. (source_cache::get_line_charpos): Get rid of try/catch and only check for the return value of "ensure". * tui/tui-source.c (tui_source_window::set_contents): Simplify "nlines" calculation. gdb/testsuite/ChangeLog: * gdb.tui/tui-missing-src.exp: Add the "missing source file" test for the TUI.
2020-01-31gdb/tui: Disassembler scrolling of very small programsAndrew Burgess2-0/+73
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
2020-01-24gdb/tui: asm window handles invalid memory and scrolls betterAndrew Burgess1-0/+42
This started as a patch to enable the asm window to handle attempts to disassemble invalid memory, but it ended up expanding into a significant rewrite of how the asm window handles scrolling. These two things ended up being tied together as it was impossible to correctly test scrolling into invalid memory when the asm window would randomly behave weirdly while scrolling. Things that should work nicely now; scrolling to the bottom or top of the listing with PageUp, PageDown, Up Arrow, Down Arrow and we should be able to scroll past small areas of memory that don't have symbols associated with them. It should also be possible to scroll to the start of a section even if there's no symbol at the start of the section. Adding tests for this scrolling was a little bit of a problem. First I would have liked to add tests for PageUp / PageDown, but the tuiterm library we use doesn't support these commands right now due to only emulating a basic ascii terminal. Changing this to emulate a more complex terminal would require adding support for more escape sequence control codes, so I've not tried to tackle that in this patch. Next, I would have liked to test scrolling to the start or end of the assembler listing and then trying to scroll even more, however, this is a problem because in a well behaving GDB a scroll at the start/end has no effect. What we need to do is: - Move to start of assembler listing, - Send scroll up command, - Wait for all curses output, - Ensure the assembler listing is unchanged, we're still at the start of the listing. The problem is that there is no curses output, so how long do we wait at step 3? The same problem exists for scrolling to the bottom of the assembler listing. However, when scrolling down you can at least see the end coming, so I added a test for this case, however, this feels like an area of code that is massively under tested. gdb/ChangeLog: PR tui/9765 * minsyms.c (lookup_minimal_symbol_by_pc_section): Update header comment, add extra parameter, and update to store previous symbol when appropriate. * minsyms.h (lookup_minimal_symbol_by_pc_section): Update comment, add extra parameter. * tui/tui-disasm.c (tui_disassemble): Update header comment, remove unneeded parameter, add try/catch around gdb_print_insn, rewrite to add items to asm_lines vector. (tui_find_backward_disassembly_start_address): New function. (tui_find_disassembly_address): Updated throughout. (tui_disasm_window::set_contents): Update for changes to tui_disassemble. (tui_disasm_window::do_scroll_vertical): No need to adjust the number of lines to scroll. gdb/testsuite/ChangeLog: PR tui/9765 * gdb.tui/tui-layout-asm.exp: Add scrolling test for asm window. Change-Id: I323987c8fd316962c937e73c17d952ccd3cfa66c
2020-01-19Make "file" clear TUI source windowTom Tromey1-0/+7
I noticed that a plain "file" will leave the current source file in the TUI source window. Instead, I think, it should clear the source window. This patch implements this. gdb/ChangeLog 2020-01-19 Tom Tromey <tom@tromey.com> * tui/tui-winsource.c (tui_update_source_windows_with_line): Handle case where symtab is null. gdb/testsuite/ChangeLog 2020-01-19 Tom Tromey <tom@tromey.com> * gdb.tui/main.exp: Add check for plain "file". Change-Id: I8424acf837f1a47f75bc6a833d1e917d4c10b51e
2020-01-09gdb/tui: Link source and assembler scrolling .... againAndrew Burgess1-0/+27
Until recently when the source window was scrolled the assembler window would scroll in sync - keeping the disassembly for the current line in view. This was broken in commit: commit b4b49dcbff6b437fa8b4e2fc0c3f27b457f11310 Date: Wed Nov 13 16:47:58 2019 -0700 Don't call tui_show_source from tui_ui_out This commit restores the synchronised scrolling and also maintains the horizontal scroll within the source view when it is vertically scrolled, something that was broken before. This commit does not mean that scrolling the assembler view scrolls the source view. The connection this way never existed, though maybe it should, but I'll leave adding this feature for a separate commit. gdb/ChangeLog: * tui/tui-source.c (tui_source_window::do_scroll_vertical): Update all source windows, and maintain horizontal scroll status while doing so. gdb/testsuite/ChangeLog: * gdb.tui/basic.exp: Add more scrolling tests. Change-Id: I250114a3bc670040a6a759d41905776771b2f818
2020-01-09gdb: Fix scrolling in TUITom Tromey1-0/+13
Hannes Domani pointed out that my previous patch to fix the "list" command in the TUI instead broke vertical scrolling. While looking at this, I found that do_scroll_vertical calls print_source_lines, which seems like a very roundabout way to change the source window. This patch removes this oddity and fixes the bug at the same time. I've added a new test case. This is somewhat tricky, because the obvious approach of sending a dummy command after the scroll did not work -- due to how the TUI works, sennding a command causes the scroll to take effect. gdb/ChangeLog 2019-12-22 Tom Tromey <tom@tromey.com> PR tui/18932: * tui/tui-source.c (tui_source_window::do_scroll_vertical): Call update_source_window, not print_source_lines. gdb/testsuite/ChangeLog 2019-12-22 Tom Tromey <tom@tromey.com> PR tui/18932: * lib/tuiterm.exp (Term::wait_for): Rename from _accept. Return a meangingful value. (Term::command, Term::resize): Update. * gdb.tui/basic.exp: Add scrolling test. Change-Id: I9636a7c8a8cade37431c6165ee996a9d556ef1c8
2020-01-09gdb/tui: Fix 'layout asm' before the inferior has startedAndrew Burgess1-0/+34
Currently if a user starts the tui with 'layout asm' then they will be presented with the 'src' layout. What happens is: 1. Layout command enables TUI, selecting the SRC layout by default. 2. As part of tui_enable we call tui_display_main, which calls tui_get_begin_asm_address, which calls set_default_source_symtab_and_line. This changes core GDBs current symtab and line, which triggers a call to the symtab changed hook tui_symtab_changed, which sets the flag from_source_symtab. 3. Back in the layout command, the layout is changed from SRC to ASM. After this the layout command completes and we return to core GDB which prints the prompt, however... 4. The before prompt hook is called which sees the from_source_symtab flag is set and forces the SRC window to be displayed. This switches us back to SRC view. The solution I propose here is to delay installing the hooks into core GDB until after we have finished setting up the tui and selecting the default frame to view. In this way we effectively ignore the first symtab changed event triggered when making main the default symtab. gdb/ChangeLog: * tui/tui.c (tui_enable): Register tui hooks after calling tui_display_main. gdb/testsuite/ChangeLog: * gdb.tui/tui-layout-asm.exp: New file. Change-Id: I858ab81a17ffb4aa72deb3f36c3755228a9c9d9a
2020-01-05gdb: use tui_set_layout not show_layout to fix window focusAndrew Burgess1-0/+3
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
2020-01-01Update copyright year range in all GDB files.Joel Brobecker15-15/+15
gdb/ChangeLog: Update copyright year range in all GDB files.
2019-12-20Fix "list" command in the TUITom Tromey1-0/+34
PR tui/18932 notes that "list" no longer works in the TUI. At some point in the past, it switched the TUI source window to show the specified source; but now this source briefly flashes before the TUI reverts to showing the current stack frame's source. This patch fixes this bug by introducing a new observer that notices when the user selected context has changed. Then, the existing before-prompt observer is updated to request the correct update: either one based on the current stack frame, or one based on the user's source symtab_and_line. gdb/ChangeLog 2019-12-20 Tom Tromey <tom@tromey.com> PR tui/18932: * tui/tui-hooks.c (tui_refresh_frame_and_register_information): Rename parameters. Handle the not-from-stack-frame case. (from_stack, from_source_symtab): New globals. (tui_before_prompt, tui_normal_stop): Update. (tui_context_changed, tui_symtab_changed): New functions. (tui_attach_detach_observers): Attach new observers. gdb/testsuite/ChangeLog 2019-12-20 Tom Tromey <tom@tromey.com> * gdb.tui/list-before.exp: New file. Change-Id: I62013825f6c1afdd568a1c7a8c019b0c881131af
2019-12-20Display "main" on initial TUI startupTom Tromey1-1/+1
I noticed that even when there's a symbol file, "tui enable" won't show "main" by default. I think it should, and this patch fixes this. gdb/ChangeLog 2019-12-20 Tom Tromey <tom@tromey.com> * tui/tui.c (tui_enable): Call tui_display_main. gdb/testsuite/ChangeLog 2019-12-20 Tom Tromey <tom@tromey.com> * gdb.tui/list.exp: Check for source on initial listing. Change-Id: Ic7bfc930e1179f5b61111e30a2dae46a98b00064
2019-12-11Fix TUI test suite regexpsTom Tromey3-4/+4
Testing on another TUI series showed that some of the regexps in the TUI test suite have been incorrect for a while. In particular, "|" was meant literally in these tests, but was interpreted as pattern alternation due to lack of quoting. This patch fixes the bad tests. I am checking this in. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/resize.exp: Fix regexp. * gdb.tui/regs.exp: Fix regexps. * gdb.tui/main.exp: Fix regexp. Change-Id: Ib6661361171ac120bb92f4a8aec7efa4bcaa36b9
2019-12-11Re-apply the current layout when resizingTom Tromey2-7/+7
The TUI has separate code for each possible layout to handle the case where the terminal window is resized. With the new layout code, this can all be replaced with a call to tui_apply_current_layout, which simply re-applies the current layout. This results in some small differences in behavior when resizing, so some tests are updated. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-win.c (tui_resize_all): Remove code, call tui_apply_current_layout. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/resize.exp: Update. * gdb.tui/empty.exp (layouts): Update. Change-Id: I3dc6c02a753d495d9ab5e8213d550a147198ce6f
2019-12-11First use of tui_layoutTom Tromey3-8/+8
This patch introduces the first use of tui_layout, by changing show_layout to clone and use the appropriate tui_layout. This resulted in one minor layout change, and also in the unintended -- but good -- side effect that the title of each boxed window is now visible. gdb/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * tui/tui-layout.h (tui_apply_current_layout): Declare. * tui/tui-layout.c (standard_layouts, applied_layout): New globals. (tui_apply_current_layout): New function. (show_layout): Set applied_layout. Call tui_apply_current_layout. (show_source_command, show_disasm_command) (show_source_disasm_command, show_data) (show_source_or_disasm_and_command): Remove. (initialize_layouts): New function. (_initialize_tui_layout): Call initialize_layouts. gdb/testsuite/ChangeLog 2019-12-11 Tom Tromey <tom@tromey.com> * gdb.tui/regs.exp: Update. * gdb.tui/empty.exp (layouts): Update. * gdb.tui/basic.exp: Update. * lib/tuiterm.exp (_check_box): Don't check bottom border. Change-Id: If1ee06ee58f4803e8c213f4ab0f5bb59f4650ec2
2019-11-19Fix the "winheight" commandTom Tromey1-0/+37
The "winheight" command is broken. I probably broke it in one of my TUI refactoring patches, though I didn't track down exactly which one. The bug is that the code does: *buf_ptr = '\0'; ... but then never advances buf_ptr past this point, so no window name is seen. This patch refactors the code a bit so that a copy of the argument string is not needed, also fixing the bug. A new test case is included. gdb/ChangeLog 2019-11-19 Tom Tromey <tom@tromey.com> * tui/tui-win.c (tui_partial_win_by_name): Move from tui-data.c. Now static. Change type of "name". (tui_set_win_height_command): Don't copy "arg". * tui/tui-data.h (tui_partial_win_by_name): Don't declare. * tui/tui-data.c (tui_partial_win_by_name): Move to tui-win.c. gdb/testsuite/ChangeLog 2019-11-19 Tom Tromey <tom@tromey.com> * gdb.tui/winheight.exp: New file. Change-Id: I0871e93777a70036dbec9c9543f862f42e3a81e5
2019-11-18Fix crash with core + TUI + runSergio Durigan Junior1-0/+61
Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1765117 A segfault can happen in a specific scenario when using TUI + a corefile, as explained in the bug mentioned above. The problem happens when opening a corefile on GDB: $ gdb ./core program entering TUI (C-x a), and then issuing a "run" command. GDB segfaults with the following stack trace: (top-gdb) bt #0 0x00000000004cd5da in target_ops::shortname (this=0x0) at ../../binutils-gdb/gdb/target.h:449 #1 0x0000000000ac08fb in target_shortname () at ../../binutils-gdb/gdb/target.h:1323 #2 0x0000000000ac09ae in tui_locator_window::make_status_line[abi:cxx11]() const (this=0x23e1fa0 <_locator>) at ../../binutils-gdb/gdb/tui/tui-stack.c:86 #3 0x0000000000ac1043 in tui_locator_window::rerender (this=0x23e1fa0 <_locator>) at ../../binutils-gdb/gdb/tui/tui-stack.c:231 #4 0x0000000000ac1632 in tui_show_locator_content () at ../../binutils-gdb/gdb/tui/tui-stack.c:369 #5 0x0000000000ac63b6 in tui_set_key_mode (mode=TUI_COMMAND_MODE) at ../../binutils-gdb/gdb/tui/tui.c:321 #6 0x0000000000aaf9be in tui_inferior_exit (inf=0x2d446a0) at ../../binutils-gdb/gdb/tui/tui-hooks.c:181 #7 0x000000000044cddf in std::_Function_handler<void (inferior*), void (*)(inferior*)>::_M_invoke(std::_Any_data const&, inferior*&&) (__functor=..., __args#0=@0x7fffffffd650: 0x2d446a0) at /usr/include/c++/9/bits/std_function.h:300 #8 0x0000000000757db9 in std::function<void (inferior*)>::operator()(inferior*) const (this=0x2cf3168, __args#0=0x2d446a0) at /usr/include/c++/9/bits/std_function.h:690 #9 0x0000000000757876 in gdb::observers::observable<inferior*>::notify (this=0x23de0c0 <gdb::observers::inferior_exit>, args#0=0x2d446a0) at ../../binutils-gdb/gdb/gdbsupport/observable.h:106 #10 0x000000000075532d in exit_inferior_1 (inftoex=0x2d446a0, silent=1) at ../../binutils-gdb/gdb/inferior.c:191 #11 0x0000000000755460 in exit_inferior_silent (inf=0x2d446a0) at ../../binutils-gdb/gdb/inferior.c:234 #12 0x000000000059f47c in core_target::close (this=0x2d68590) at ../../binutils-gdb/gdb/corelow.c:265 #13 0x0000000000a7688c in target_close (targ=0x2d68590) at ../../binutils-gdb/gdb/target.c:3293 #14 0x0000000000a63d74 in target_stack::push (this=0x23e1800 <g_target_stack>, t=0x23c38c8 <the_amd64_linux_nat_target>) at ../../binutils-gdb/gdb/target.c:568 #15 0x0000000000a63dbf in push_target (t=0x23c38c8 <the_amd64_linux_nat_target>) at ../../binutils-gdb/gdb/target.c:583 #16 0x0000000000748088 in inf_ptrace_target::create_inferior (this=0x23c38c8 <the_amd64_linux_nat_target>, exec_file=0x2d58d30 "/usr/bin/cat", allargs="", env=0x25f12b0, from_tty=1) at ../../binutils-gdb/gdb/inf-ptrace.c:128 #17 0x0000000000795ccb in linux_nat_target::create_inferior (this=0x23c38c8 <the_amd64_linux_nat_target>, exec_file=0x2d58d30 "/usr/bin/cat", allargs="", env=0x25f12b0, from_tty=1) at ../../binutils-gdb/gdb/linux-nat.c:1094 #18 0x000000000074eae9 in run_command_1 (args=0x0, from_tty=1, run_how=RUN_NORMAL) at ../../binutils-gdb/gdb/infcmd.c:639 ... The problem happens because 'tui_locator_window::make_status_line' needs the value of 'target_shortname' in order to update the status line. 'target_shortname' is a macro which expands to: #define target_shortname (current_top_target ()->shortname ()) and, in our scenario, 'current_top_target ()' returns NULL, which obviously causes a segfault. But why does it return NULL, since, according to its comment on target.h, it should never do that? What is happening is that we're being caught in the middle of a "target switch". We had the 'core_target' on top, because we were inspecting a corefile, but when the user decided to invoke "run" GDB had to actually create the inferior, which ends up detecting that we have a target already, and tries to close it (from target.c): /* See target.h. */ void target_stack::push (target_ops *t) { /* If there's already a target at this stratum, remove it. */ strata stratum = t->stratum (); if (m_stack[stratum] != NULL) { target_ops *prev = m_stack[stratum]; m_stack[stratum] = NULL; target_close (prev); // <-- here } ... When the current target ('core_target') is being closed, it checks for possible observers registered with it and calls them. TUI is one of those observers, it gets called, tries to update the status line, and GDB crashes. The real problem is that we are clearing 'm_stack[stratum]', but forgetting to adjust 'm_top'. Interestingly, this scenario is covered in 'target_stack::unpush', but Pedro said he forgot to call it here.. The fix, therefore, is to call '::unpush' if there's a target on the stack. This patch has been tested on the Buildbot and no regressions have been found. I'm also submitting a testcase for it. gdb/ChangeLog: 2019-11-18 Sergio Durigan Junior <sergiodj@redhat.com> Pedro Alves <palves@redhat.com> https://bugzilla.redhat.com/show_bug.cgi?id=1765117 * target.c (target_stack::push): Call 'unpush' if there's a target on top of the stack. gdb/testsuite/ChangeLog: 2019-11-18 Sergio Durigan Junior <sergiodj@redhat.com> https://bugzilla.redhat.com/show_bug.cgi?id=1765117 * gdb.tui/corefile-run.exp: New file. Change-Id: I39e2f8b538c580c8ea5bf1d657ee877e47746c8f
2019-11-12Make TUI resizing tests more robustTom Tromey1-11/+10
As Sergio pointed out, the TUI resizing tests are flaky. Debugging this showed three main problems. 1. expect's "stty" command processes its arguments one-by-one. So, rather than requesting a single resize, it sends two separate resize requests (one for rows and one for columns). This means gdb sees two SIGWINCH signals and resizes the terminal twice. I consider this a bug in expect, but I couldn't readily see how to report a bug; and anyway the fix wouldn't propagate very quickly. This patch works around this problem by explicitly doing two separate resizes (so it will be robust if expect ever does change); and then by waiting for each resize to complete before continuing. 2. gdb uses curses to drive the console rendering. Currently the test suite looks for terminal text insertion sequences to decide when a command has completed. However, it turns out that, sometimes, curses can output things in non-obvious ways. I didn't debug into curses but I guess this can happen due to output optimizations. No matter the reason, sometimes the current approach of only tracking text insertions is not enough to detect that gdb has finished rendering. This patch fixes this problem by arranging to detect the termination output after any curses command, not just insertion. 3. Detecting when a resize has completed is tricky. In fact, I could not find a way to reliably do this. This patch fixes this problem by adding a special maint "tui-resize-message" setting to gdb. When this is enabled, gdb will print a message after each SIGWINCH has been fully processed. The test suite enables this mode and then waits for the message in order to know when control can be returned to the calling test. This patch also adds a timeout, to avoid the situation where the terminal code fails to notice a change for some reason. This lets the test at least try to continue. gdb/ChangeLog 2019-11-12 Tom Tromey <tom@tromey.com> * tui/tui-win.c (resize_message): New global. (show_tui_resize_message): New function. (tui_async_resize_screen): Print message if requested. (_initialize_tui_win): Add tui-resize-message setting. * NEWS: Add entry for new commands. gdb/doc/ChangeLog 2019-11-12 Tom Tromey <tom@tromey.com> * gdb.texinfo (Maintenance Commands): Document new command. gdb/testsuite/ChangeLog 2019-11-12 Tom Tromey <tom@tromey.com> * lib/tuiterm.exp (_accept): Add wait_for parameter. Check output after any command. Expect prompt after WAIT_FOR is seen. (enter_tui): Enable resize messages. (command): Expect command in output. (get_line): Avoid error when cursor appears to be off-screen. (dump_screen): Include screen size in title. (_do_resize): New proc, from "resize". (resize): Rewrite. Do resize in two steps. * gdb.tui/empty.exp (layouts): Fix entries. (check_boxes): Remove xfail. (check_text): Dump screen on failure. Change-Id: I420e0259cb99b21adcd28f671b99161eefa7a51d
2019-09-08Truncate long TUI window titlesTom Tromey3-11/+0
If a TUI window has a long title, it can overflow the title line. This changes the TUI to use just the tail part of the title in this case. gdb/ChangeLog 2019-09-08 Tom Tromey <tom@tromey.com> * tui/tui-wingeneral.c (box_win): Truncate long window titles. gdb/testsuite/ChangeLog 2019-09-08 Tom Tromey <tom@tromey.com> * gdb.tui/resize.exp: Remove setup_xfail. * gdb.tui/regs.exp: Remove setup_xfail. * gdb.tui/basic.exp: Remove setup_xfail.
2019-08-16Remove the TUI execution info windowTom Tromey2-10/+10
The TUI execution info window is unusual in that it is always linked to a source or disassembly window. Even updates of its content are handled by the source window, so it really has no life of its own. This patch removes this window entirely and puts its functionality directly into the source window. This simplifies the code somewhat. This is a user-visible change, because now the box around the source (or disassembly) window encloses the execution info as well. I consider this an improvement as well, though. Note that this patch caused ncurses to start emitting the "CSI Z" sequence, so I've added this to the test suite terminal implementation. gdb/ChangeLog 2019-08-16 Tom Tromey <tom@tromey.com> * tui/tui.h (enum tui_win_type) <EXEC_INFO_WIN>: Remove. * tui/tui-winsource.h (struct tui_exec_info_window): Remove. (struct tui_source_window_base) <make_visible, refresh_window, resize>: Remove methods. <execution_info>: Remove field. * tui/tui-winsource.c (tui_source_window_base::do_erase_source_content) (tui_show_source_line, tui_source_window_base) (~tui_source_window_base): Update. (tui_source_window_base::resize) (tui_source_window_base::make_visible) (tui_source_window_base::refresh_window): Remove. (tui_source_window_base::update_exec_info): Update. * tui/tui-source.c (tui_source_window::set_contents): Update. * tui/tui-disasm.c (tui_disasm_window::set_contents): Update. gdb/testsuite/ChangeLog 2019-08-16 Tom Tromey <tom@tromey.com> * lib/tuiterm.exp (_csi_Z): New proc. * gdb.tui/basic.exp: Update window positions. * gdb.tui/empty.exp: Update window positions.
2019-08-15TUI resize unificationTom Tromey1-10/+8
The TUI currently has two different ways to resize a window: the resize method, and the methods make_invisible_and_set_new_height and make_visible_with_new_height. There's no deep reason to have two different ways to resize a window, so this patch unifies them, leaving just the "resize" method. This also changes the locator to be handled more like an ordinary window and less like an adjunct of the associated source window. gdb/ChangeLog 2019-08-15 Tom Tromey <tom@tromey.com> * tui/tui-io.c (tui_puts_internal): Check TUI_CMD_WIN before calling update_cmdwin_start_line. * tui/tui-winsource.h (struct tui_source_window_base) <do_make_visible_with_new_height, set_new_height>: Don't declare. <rerender>: Declare. * tui/tui-winsource.c (tui_source_window_base::update_tab_width): Call rerender. (tui_source_window_base::set_new_height): Remove. (tui_source_window_base::rerender): Rename from do_make_visible_with_new_height. * tui/tui-win.c (tui_resize_all, tui_adjust_win_heights): Use resize method. (tui_win_info::make_invisible_and_set_new_height) (tui_win_info::make_visible_with_new_height): Remove. * tui/tui-stack.h (struct tui_locator_window) <rerender>: Declare. * tui/tui-stack.c (tui_locator_window::rerender): New method. * tui/tui-regs.h (struct tui_data_window) <set_new_height, do_make_visible_with_new_height>: Don't declare. <rerender>: Declare. * tui/tui-regs.c (tui_data_window::rerender): Rename from set_new_height. (tui_data_window::do_make_visible_with_new_height): Remove. * tui/tui-layout.c (show_source_disasm_command, show_data): Don't call tui_show_locator_content. (tui_gen_win_info::resize): Call rerender. (show_source_or_disasm_and_command): Don't call tui_show_locator_content. * tui/tui-data.h (struct tui_gen_win_info) <rerender>: New method. (struct tui_win_info) <rerender>: Declare. <set_new_height, make_invisible_and_set_new_height, make_visible_with_new_height>: Don't declare. * tui/tui-data.c (tui_win_list::rerender): New method. * tui/tui-command.h (struct tui_cmd_window) <do_make_visible_with_new_height>: Don't declare. * tui/tui-command.c (tui_cmd_window::do_make_visible_with_new_height): Remove. gdb/testsuite/ChangeLog 2019-08-15 Tom Tromey <tom@tromey.com> * gdb.tui/empty.exp: Enable resizing tests.
2019-07-27Add test that "file" shows "main"Tom Tromey1-0/+34
This adds a new test that checks that the "file" command will show the program's "main". gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * gdb.tui/main.exp: New file.
2019-07-27Add test case for empty TUI windowsTom Tromey1-0/+103
My original intent here was to add a test case to test that empty TUI windows re-render their contents after a resize. However, this seems pretty broken at the moment, so a lot of the test is actually disabled. gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * lib/tuiterm.exp (Term::clean_restart): Make "executable" optional. * gdb.tui/empty.exp: New file.
2019-07-27Add TUI resizing testTom Tromey1-0/+42
This adds a test case that resizes the terminal and then checks that the TUI updates properly. gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * lib/tuiterm.exp (spawn): New proc. (Term::resize): New proc. * gdb.tui/resize.exp: New file.
2019-07-27Add TUI test for "list"Tom Tromey1-0/+37
This adds a test to check that the "list" command will update the TUI source window. gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * gdb.tui/list.exp: New file.
2019-07-27Add TUI register window testTom Tromey1-0/+48
This adds a very simple test of the TUI register window. gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * gdb.tui/regs.exp: New file.
2019-07-27Add "layout split" testTom Tromey1-0/+9
This adds a test of "layout split" to the TUI test suite. gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * gdb.tui/basic.exp: Add "layout split" test.
2019-07-27Add test for "layout asm"Tom Tromey1-0/+5
This adds a very simple test for "layout asm". gdb/testsuite/ChangeLog 2019-07-27 Tom Tromey <tom@tromey.com> * gdb.tui/basic.exp: Add "layout asm" test.