Bug 30325 - [gdb/tui] Stray '[' before insn adddress
Summary: [gdb/tui] Stray '[' before insn adddress
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: tui (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: 14.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-04-07 09:10 UTC by Tom de Vries
Modified: 2023-04-12 22:19 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
Project(s) to access:
ssh public key:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2023-04-07 09:10:04 UTC
When running test-case gdb.tui/tui-layout-asm.exp with tui_asm_window_width set to 60, I get:
...
Box Dump (60 x 15) @ (0, 0):
    0 +----------------------------------------------------------+
    1 |    0x4004a7 <main>         push   %rbp                   |
    2 |    0x4004a8 <main+1>       mov    %rsp,%rbp              |
    3 |    0x4004ab <main+4>       mov    $0x0,%eax              |
    4 |    0x4004b0 <main+9>       pop    %rbp                   |
    5 |    0x4004b1 <main+10>      ret                           |
    6 |    0x4004b2                cs nopw 0x0(%rax,%rax,1)      |
    7 |   [0x4004bc                nopl   0x0(%rax)              |
    8 |    0x4004c0                nop                           |
    9 |    0x4004c1                nop                           |
   10 |    0x4004c2                nop                           |
   11 |    0x4004c3                nop                           |
   12 |    0x4004c4                nop                           |
   13 |    0x4004c5                nop                           |
   14 +----------------------------------------------------------+
...

There seems to be a stray '[' at line 7.

I reproduced it on an actual terminal, after setting cols/rows to 24/60:
...
$ ( export TERM=ansi; gdb tui-layout-asm -ex "maint set tui-resize-message on" -ex "set tui border-kind ascii" -ex "tui enable" -ex "layout asm" )
...
and got:
...
+----------------------------------------------------------+
|    0x4004a7 <main>         push   %rbp                   |
|    0x4004a8 <main+1>       mov    %rsp,%rbp              |
|    0x4004ab <main+4>       mov    $0x0,%eax              |
|    0x4004b0 <main+9>       pop    %rbp                   |
|    0x4004b1 <main+10>      ret                           |
|    0x4004b2                cs nopw 0x0(%rax,%rax,1)      |
|   [0x4004bc                nopl   0x0(%rax)              |
|    0x4004c0                nop                           |
|    0x4004c1                nop                           |
|    0x4004c2                nop                           |
|    0x4004c3                nop                           |
|    0x4004c4                nop                           |
|    0x4004c5                nop                           |
+----------------------------------------------------------+
...

So, this isn't related to the tuienv terminal emulator.
Comment 1 Tom de Vries 2023-04-07 09:13:59 UTC
(In reply to Tom de Vries from comment #0)
> When running test-case gdb.tui/tui-layout-asm.exp with tui_asm_window_width
> set to 60, I get:
> ...
> Box Dump (60 x 15) @ (0, 0):
>     0 +----------------------------------------------------------+
>     1 |    0x4004a7 <main>         push   %rbp                   |
>     2 |    0x4004a8 <main+1>       mov    %rsp,%rbp              |
>     3 |    0x4004ab <main+4>       mov    $0x0,%eax              |
>     4 |    0x4004b0 <main+9>       pop    %rbp                   |
>     5 |    0x4004b1 <main+10>      ret                           |
>     6 |    0x4004b2                cs nopw 0x0(%rax,%rax,1)      |
>     7 |   [0x4004bc                nopl   0x0(%rax)              |
>     8 |    0x4004c0                nop                           |
>     9 |    0x4004c1                nop                           |
>    10 |    0x4004c2                nop                           |
>    11 |    0x4004c3                nop                           |
>    12 |    0x4004c4                nop                           |
>    13 |    0x4004c5                nop                           |
>    14 +----------------------------------------------------------+
> ...
> 

In contrast, with tui_asm_window_width == 65:
...
    0 +---------------------------------------------------------------+
    1 |    0x4004a7 <main>         push   %rbp                        |
    2 |    0x4004a8 <main+1>       mov    %rsp,%rbp                   |
    3 |    0x4004ab <main+4>       mov    $0x0,%eax                   |
    4 |    0x4004b0 <main+9>       pop    %rbp                        |
    5 |    0x4004b1 <main+10>      ret                                |
    6 |    0x4004b2                cs nopw 0x0(%rax,%rax,1)           |
    7 |    0x4004bc                nopl   0x0(%rax)                   |
    8 |    0x4004c0                nop                                |
    9 |    0x4004c1                nop                                |
   10 |    0x4004c2                nop                                |
   11 |    0x4004c3                nop                                |
   12 |    0x4004c4                nop                                |
   13 |    0x4004c5                nop                                |
   14 +---------------------------------------------------------------+
...
Comment 2 Tom de Vries 2023-04-07 09:55:25 UTC
Also happens when build with gdb's readline instead of system readline.
Comment 3 Tom de Vries 2023-04-07 14:25:10 UTC
Tentative patch:
...
diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c
index 52a0f7af00f..16badd6dbe4 100644
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -666,7 +666,8 @@ tui_source_window_base::update_exec_info (bool refresh_p)
   for (int i = 0; i < m_content.size (); i++)
     {
       struct tui_source_element *src_element = &m_content[i];
-      char element[TUI_EXECINFO_SIZE] = "   ";
+      /* Add 1 for terminating '\0'.  Init to TUI_EXECINFO_SIZE spaces.  */
+      char element[TUI_EXECINFO_SIZE + 1] = "    ";
 
       /* Now update the exec info content based upon the state
         of each line as indicated by the source content.  */
diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h
index 7370ae95d8b..bce9097ee41 100644
--- a/gdb/tui/tui-winsource.h
+++ b/gdb/tui/tui-winsource.h
@@ -58,6 +58,7 @@ DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
 #define TUI_BP_HIT_POS      0
 #define TUI_BP_BREAK_POS    1
 #define TUI_EXEC_POS        2
+#define TUI_SPACE_POS       3
 #define TUI_EXECINFO_SIZE   4
 
 /* Elements in the Source/Disassembly Window.  */
...
Comment 4 Tom de Vries 2023-04-07 16:13:33 UTC
So, I finally figured out what we're looking at.

It's the '[' in "[ No Assembly Available ]":
...
    0 +----------------------------------------------------------+
    1 |                                                          |
    2 |                                                          |
    3 |                                                          |
    4 |                                                          |
    5 |                                                          |
    6 |                                                          |
    7 |   [ No Assembly Available ]                              |
    8 |                                                          |
    9 |                                                          |
   10 |                                                          |
   11 |                                                          |
   12 |                                                          |
   13 |                                                          |
   14 +----------------------------------------------------------+
...
Comment 5 Tom de Vries 2023-04-11 08:24:33 UTC
Patch submitted at https://sourceware.org/pipermail/gdb-patches/2023-April/198780.html .
Comment 6 Sourceware Commits 2023-04-12 22:18:09 UTC
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=58b77c6af2ed391b263460ef37285ee5cfebc69f

commit 58b77c6af2ed391b263460ef37285ee5cfebc69f
Author: Tom de Vries <tdevries@suse.de>
Date:   Thu Apr 13 00:18:12 2023 +0200

    [gdb/tui] Add maint set/show tui-left-margin-verbose
    
    The TUI has two types of windows derived from tui_source_window_base:
    - tui_source_window (the source window), and
    - tui_disasm_window (the disassembly window).
    
    The two windows share a common concept: the left margin.
    
    With a hello world a.out, we can see the source window:
    ...
    ââ/home/vries/hello.cââââââââââââââââââââââââââââââââââââââââ
    â        5  {                                               â
    âB+>     6    printf ("hello\n");                           â
    â        7    return 0;                                     â
    â        8  }                                               â
    â        9                                                  â
    â
    ...
    where the left margin is the part holding "B+>" and the line number, and the
    disassembly window:
    ...
    âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
    â    0x555555555149 <main>           endbr64                â
    â    0x55555555514d <main+4>         push   %rbp            â
    â    0x55555555514e <main+5>         mov    %rsp,%rbp       â
    âB+> 0x555555555151 <main+8>         lea    0xeac(%rip),%raxâ
    â    0x555555555158 <main+15>        mov    %rax,%rdi       â
    ...
    where the left margin is just the bit holding "B+>".
    
    Because the left margin contains some spaces, it's not clear where it starts
    and ends, making it harder to observe problems related to it.
    
    Add a new maintenance command "maint set tui-left-margin-verbose", that when
    set to on replaces the spaces in the left margin with either '_' or '0',
    giving us this for the source window:
    ...
    ââ/home/vries/hello.cââââââââââââââââââââââââââââââââââââââââ
    â___000005__{                                               â
    âB+>000006__  printf ("hello\n");                           â
    â___000007__  return 0;                                     â
    â___000008__}                                               â
    ...
    and this for the disassembly window:
    ...
    âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
    â___ 0x555555555149 <main>           endbr64                â
    â___ 0x55555555514d <main+4>         push   %rbp            â
    â___ 0x55555555514e <main+5>         mov    %rsp,%rbp       â
    âB+> 0x555555555151 <main+8>         lea    0xeac(%rip),%raxâ
    â___ 0x555555555158 <main+15>        mov    %rax,%rdi       â
    ...
    
    Note the space between "B+>" and 0x555555555151.  The space shows that a bit
    of the left margin is not written, a problem reported as PR tui/30325.
    
    Specifically, PR tui/30325 is about the fact that the '[' character from the
    string "[ No Assembly Available ]" ends up in that same spot:
    ...
    âB+>[0x555555555151 <main+8>         lea    0xeac(%rip),%raxâ
    ...
    which only happens for certain window widths.
    
    The new command allows us to spot the problem with any window width.
    
    Likewise, when we revert the fix from commit 1b6d4bb2232 ("Redraw both spaces
    between line numbers and source code"), we have:
    ...
    ââ/home/vries/hello.cââââââââââââââââââââââââââââââââââââââââ
    â___000005_ {                                               â
    âB+>000006_   printf ("hello\n");                           â
    â___000007_   return 0;                                     â
    â___000008_ }                                               â
    ...
    showing a similar problem at the space between '_' and '{'.
    
    Tested on x86_64-linux.
    
    Reviewed-By: Eli Zaretskii <eliz@gnu.org>
    Approved-By: Tom Tromey <tom@tromey.com>
Comment 7 Sourceware Commits 2023-04-12 22:18:14 UTC
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5479c4c7c9e7179d95c6520cdef98ae175874cab

commit 5479c4c7c9e7179d95c6520cdef98ae175874cab
Author: Tom de Vries <tdevries@suse.de>
Date:   Thu Apr 13 00:18:12 2023 +0200

    [gdb/tui] Fix left margin in disassembly window
    
    With a hello world a.out, and maint set tui-left-margin-verbose on, we have
    this disassembly window:
    ...
    âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
    â___ 0x555555555149 <main>           endbr64                â
    â___ 0x55555555514d <main+4>         push   %rbp            â
    â___ 0x55555555514e <main+5>         mov    %rsp,%rbp       â
    âB+> 0x555555555151 <main+8>         lea    0xeac(%rip),%raxâ
    â___ 0x555555555158 <main+15>        mov    %rax,%rdi       â
    ...
    Note the space between "B+>" and 0x555555555151.  The space shows that a bit
    of the left margin is not written, which is a problem because that location is
    showing a character previously written, which happens to be a space, but also
    may be something else, for instance a '[' as reported in PR tui/30325.
    
    The problem is caused by confusion about the meaning of:
    ...
     #define TUI_EXECINFO_SIZE 4
    ...
    
    There's the meaning of defining the size of this zero-terminated char array:
    ...
          char element[TUI_EXECINFO_SIZE];
    ...
    which is used to print the "B+>" bit, which is 3 chars wide.
    
    And there's the meaning of defining part of the size of the left margin:
    ...
      int left_margin () const
      { return 1 + TUI_EXECINFO_SIZE + extra_margin (); }
    ...
    where it represents 4 chars.
    
    The discrepancy between the two causes the space between "B+>" and
    "0x555555555151".
    
    Fix this by redefining TUI_EXECINFO_SIZE to 3, and using:
    ...
          char element[TUI_EXECINFO_SIZE + 1];
    ...
    such that we have:
    ...
    |B+>0x555555555151 <main+8>         lea    0xeac(%rip),%rax â
    ...
    
    This changes the layout of the disassembly window back to what it was before
    commit 9e820dec13e ("Use a curses pad for source and disassembly windows"),
    the commit that introduced the PR30325 regression.
    
    This also changes the source window from:
    ...
    â___000005__{                                               |
    ...
    to:
    ...
    â___000005_{                                                |
    ...
    
    Tested on x86_64-linux.
    
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30325
    
    Approved-By: Tom Tromey <tom@tromey.com>
Comment 8 Tom de Vries 2023-04-12 22:19:01 UTC
Fixed.