From: Vasili Burdo via Gdb-patches <gdb-patches@sourceware.org>
To: Simon Marchi <simon.marchi@polymtl.ca>
Cc: Simon Marchi <simon.marchi@efficios.com>,
Vasili Burdo via Gdb-patches <gdb-patches@sourceware.org>
Subject: Re: [PATCH v4] gdb/tui/disassembly view: make symbol name appear on a line of its own
Date: Mon, 24 Jan 2022 22:39:04 +0300 [thread overview]
Message-ID: <CANacp62CARDC0Av48bHqr4ckDBB+avHH9VgDi-DWtkUGDy8hcQ@mail.gmail.com> (raw)
In-Reply-To: <20220124192811.1530670-1-simon.marchi@polymtl.ca>
Hi, Simon
Everything is OK.
Thanks for help.
пн, 24 янв. 2022 г., 22:28 Simon Marchi <simon.marchi@polymtl.ca>:
> From: Vasili Burdo <vasili.burdo@gmail.com>
>
> Hi Vasili,
>
> Here's a new version of your patch [1], I did the following changes:
>
> - Updated gdb.ui tests.
> - Renamed tal2 to tal_header.
> - Omitted copying tal to tal2 (tal_header), since we overwrite all the
> fields anyway.
> - General formatting.
> - Added commit message (see below)
>
> Since the patch is still in your name, please let me know if that is OK
> with you.
>
> [1] https://sourceware.org/pipermail/gdb-patches/2022-January/185399.html
>
> ~~~
>
> When debbugging C++ programs, symbols tend to be quite long. This makes
> the TUI's disassembly view difficult to use, as each line includes the
> function's symbol name, which can leave little or no room for the
> instructions. For example:
>
> │ 0x7ffff4037b27
> <_Z22read_src_fs_parametersPK8bt_valuePS1_S2_P16ctf_fs_componentP17bt_self_componentP23bt_self_component_class+1390>
> movb $0x1,-0xa│
> │ 0x7ffff4037b2e
> <_Z22read_src_fs_parametersPK8bt_valuePS1_S2_P16ctf_fs_componentP17bt_self_componentP23bt_self_component_class+1397>
> lea -0x40(%rb│
> │ 0x7ffff4037b32
> <_Z22read_src_fs_parametersPK8bt_valuePS1_S2_P16ctf_fs_componentP17bt_self_componentP23bt_self_component_class+1401>
> mov %rax,%rdx│
> │ 0x7ffff4037b35
> <_Z22read_src_fs_parametersPK8bt_valuePS1_S2_P16ctf_fs_componentP17bt_self_componentP23bt_self_component_class+1404>
> shr $0x3,%rdx│
>
> To address this, stop including the symbol name with the offset on each
> line. Instead, put it on a line of its own just before the address is
> points to. Because it would be possible for the current symbol name to
> be outside the window, and therefore it would be difficult for the user
> to know what function they are currently stepping into, make it so the
> first symbol name always "sticks" to the top of the window.
>
> The instructions from the example above would now look like this:
>
> │
> _Z22read_src_fs_parametersPK8bt_valuePS1_S2_P16ctf_fs_componentP17bt_self_componentP23bt_self_component_class:
> │
> │ 0x7ffff4037b27 <+1390> movb $0x1,-0xa1(%rbp)
>
> │
> │ 0x7ffff4037b2e <+1397> lea -0x40(%rbx),%rax
>
> │
> │ 0x7ffff4037b32 <+1401> mov %rax,%rdx
>
> │
>
> Update the gdb.tui tests to match the new output. The changes are all
> trivial except the scrolling test in gdb.tui/tui-layout-asm.exp. The
> new behavior means that sometimes, when scrolling down, two lines will
> disappear at once instead of a single line, when the last instruction
> mapped to a symbol goes out of view. Update the test to account for
> that.
>
> Change-Id: I9cf46c094058b9382087b54d212f22265b1fc324
> Co-Authored-By: Simon Marchi <simon.marchi@efficios.com>
> ---
> gdb/testsuite/gdb.tui/basic.exp | 4 +-
> gdb/testsuite/gdb.tui/list.exp | 2 +-
> gdb/testsuite/gdb.tui/new-layout.exp | 4 +-
> .../gdb.tui/tui-layout-asm-short-prog.exp | 5 +-
> gdb/testsuite/gdb.tui/tui-layout-asm.exp | 18 +++---
> gdb/tui/tui-disasm.c | 62 +++++++++++++++++--
> 6 files changed, 76 insertions(+), 19 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.tui/basic.exp
> b/gdb/testsuite/gdb.tui/basic.exp
> index 0e9f2e3eab28..82fec97319a1 100644
> --- a/gdb/testsuite/gdb.tui/basic.exp
> +++ b/gdb/testsuite/gdb.tui/basic.exp
> @@ -96,13 +96,13 @@ if {[Term::wait_for $regexp] \
> Term::check_box "source box" 0 0 80 15
>
> Term::command "layout asm"
> -Term::check_contents "asm window shows main" "$hex <main>"
> +Term::check_contents "asm window shows main" " main:"
>
> Term::check_box "asm box" 0 0 80 15
>
> Term::command "layout split"
> Term::check_contents "split layout contents" \
> - "$main_line *$main_re.*$hex <main>"
> + "$main_line *$main_re.* main:"
>
> Term::check_box "source box in split layout" 0 0 80 7
> Term::check_box "asm box in split layout" 0 6 80 9
> diff --git a/gdb/testsuite/gdb.tui/list.exp
> b/gdb/testsuite/gdb.tui/list.exp
> index d153052cfd77..00854097a2d3 100644
> --- a/gdb/testsuite/gdb.tui/list.exp
> +++ b/gdb/testsuite/gdb.tui/list.exp
> @@ -32,7 +32,7 @@ if {![Term::enter_tui]} {
> Term::check_contents "initial source listing" "21 *return 0"
>
> Term::command "layout asm"
> -Term::check_contents "asm window shows main" "$hex <main>"
> +Term::check_contents "asm window shows main" " main:"
>
> Term::command "list -q main"
> Term::check_contents "list -q main" "21 *return 0"
> diff --git a/gdb/testsuite/gdb.tui/new-layout.exp
> b/gdb/testsuite/gdb.tui/new-layout.exp
> index 2b5e07db612c..f64b11c6ea44 100644
> --- a/gdb/testsuite/gdb.tui/new-layout.exp
> +++ b/gdb/testsuite/gdb.tui/new-layout.exp
> @@ -81,13 +81,13 @@ gdb_assert {![string match "No Source Available"
> $text]} \
>
> Term::command "layout example"
> Term::check_contents "example layout shows assembly" \
> - "$hex <main>"
> + " main:"
>
> Term::command "layout h"
> Term::check_box "left window box" 0 0 40 15
> Term::check_box "right window box" 39 0 41 15
> Term::check_contents "horizontal display" \
> - "$hex <main>.*21.*return 0"
> + " main:.*21.*return 0"
>
> Term::command "winheight src - 5"
> Term::check_box "left window box after shrink" 0 0 40 10
> diff --git a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
> b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
> index a6be799113df..6f43b4cac73c 100644
> --- a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
> +++ b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.exp
> @@ -34,7 +34,7 @@ if {![Term::prepare_for_tui]} {
>
> # This puts us into TUI mode, and should display the ASM window.
> Term::command_no_prompt_prefix "layout asm"
> -Term::check_box_contents "check asm box contents" 0 0 80 15 "<_start>"
> +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]
> @@ -44,7 +44,8 @@ set first_line [Term::get_line 1]
> Term::command "+ 13"
> Term::check_box_contents "check asm box contents again" 0 0 80 15 \
> [multi_line \
> - "^ *$hex\[^\r\n\]+" \
> + " *_start: *" \
> + " *$hex\[^\r\n\]+" \
> "\\s+"]
>
> # Now scroll backward again, we should return to the start of the
> diff --git a/gdb/testsuite/gdb.tui/tui-layout-asm.exp
> b/gdb/testsuite/gdb.tui/tui-layout-asm.exp
> index a76e637b4c93..6eda03d922f4 100644
> --- a/gdb/testsuite/gdb.tui/tui-layout-asm.exp
> +++ b/gdb/testsuite/gdb.tui/tui-layout-asm.exp
> @@ -40,7 +40,7 @@ proc count_whitespace { string } {
>
> # This puts us into TUI mode, and should display the ASM window.
> Term::command_no_prompt_prefix "layout asm"
> -Term::check_box_contents "check asm box contents" 0 0
> ${tui_asm_window_width} 15 "<main>"
> +Term::check_box_contents "check asm box contents" 0 0
> ${tui_asm_window_width} 15 " main:"
>
> # Scroll the ASM window down using the down arrow key. In an ideal
> # world we'd like to use PageDown here, but currently our terminal
> @@ -48,10 +48,13 @@ Term::check_box_contents "check asm box contents" 0 0
> ${tui_asm_window_width} 15
> set testname "scroll to end of assembler"
> set down_count 0
> while (1) {
> - # Grab the second line, this is about to become the first line.
> - set line [Term::get_line 2]
> + # Grab the third line, this is about to become either the first or the
> + # second line. If the last instruction of a function goes out of the
> window
> + # the scroll will make two lines disappear, the line with the symbol
> name and
> + # the line with the instruction.
> + set line [Term::get_line 3]
>
> - # Except, if the second line is blank then we are at the end of
> + # Except, if the third line is blank then we are at the end of
> # the available asm output. Pressing down again _shouldn't_
> # change the output, however, if GDB is working, and we press down
> # then the screen won't change, so the call to Term::wait_for
> @@ -70,11 +73,12 @@ while (1) {
> # Ignore whitespace mismatches.
> regsub -all {\s+} $re_line {\s+} re_line
> if {[Term::wait_for $re_line] \
> - && [regexp $re_line [Term::get_line 1]]} {
> + && ([regexp $re_line [Term::get_line 1]]
> + || [regexp $re_line [Term::get_line 2]])} {
> # We scrolled successfully.
> } else {
> if {[count_whitespace ${line}] != \
> - [count_whitespace [Term::get_line 1]]} {
> + [count_whitespace [Term::get_line 2]]} {
> # GDB's TUI assembler display will widen columns based on
> # the longest item that appears in a column on any line.
> # As we have just scrolled, and so revealed a new line, it
> @@ -93,7 +97,7 @@ while (1) {
> verbose -log " details."
> }
>
> - fail "$testname (scroll failed)"
> + fail "$testname (scroll failed, down_count=$down_count)"
> Term::dump_screen
> break
> }
> diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
> index f40d4e2e9f1c..027231e466b1 100644
> --- a/gdb/tui/tui-disasm.c
> +++ b/gdb/tui/tui-disasm.c
> @@ -27,6 +27,7 @@
> #include "value.h"
> #include "source.h"
> #include "disasm.h"
> +#include "valprint.h"
> #include "tui/tui.h"
> #include "tui/tui-command.h"
> #include "tui/tui-data.h"
> @@ -93,6 +94,10 @@ len_without_escapes (const std::string &str)
> field on each item in ASM_LINES, otherwise the addr_size fields within
> ASM_LINES are undefined.
>
> + FOR_UI boolean flag shows the purpose this function is called for.
> TRUE
> + means we're going to show ASM_LINES on screen, FALSE means ASM_LINES
> are
> + used to figure out current scroll position or any other purpose.
> +
> It is worth noting that ASM_LINES might not have COUNT entries when
> this
> function returns. If the disassembly is truncated for some other
> reason, for example, we hit invalid memory, then ASM_LINES can have
> @@ -101,7 +106,8 @@ static CORE_ADDR
> tui_disassemble (struct gdbarch *gdbarch,
> std::vector<tui_asm_line> &asm_lines,
> CORE_ADDR pc, int count,
> - size_t *addr_size = nullptr)
> + size_t *addr_size = nullptr,
> + bool for_ui = false)
> {
> bool term_out = source_styling && gdb_stdout->can_emit_style_escape ();
> string_file gdb_dis_out (term_out);
> @@ -110,7 +116,7 @@ tui_disassemble (struct gdbarch *gdbarch,
> asm_lines.clear ();
>
> /* Now construct each line. */
> - for (int i = 0; i < count; ++i)
> + while (asm_lines.size () < count)
> {
> tui_asm_line tal;
> CORE_ADDR orig_pc = pc;
> @@ -135,8 +141,54 @@ tui_disassemble (struct gdbarch *gdbarch,
>
> /* And capture the address the instruction is at. */
> tal.addr = orig_pc;
> - print_address (gdbarch, orig_pc, &gdb_dis_out);
> - tal.addr_string = std::move (gdb_dis_out.string ());
> + if (for_ui)
> + {
> + /* If we're rendering for UI... */
> + std::string name, filename;
> + int unmapped = 0, offset = 0, line = 0;
> +
> + if (build_address_symbolic (gdbarch, orig_pc, asm_demangle,
> + false, &name, &offset, &filename, &line, &unmapped) == 0)
> + {
> + if (offset == 0 || asm_lines.empty ())
> + {
> + /* "offset == 0" means function start,
> + "asm_lines.empty ()" means top line of output.
> + For these cases, insert "function header" on top of
> + "real" disassembly line. */
> + fputs_styled (name.c_str (), function_name_style.style
> (),
> + &gdb_dis_out);
> + fputs_filtered (":", &gdb_dis_out);
> +
> + tui_asm_line tal_header;
> + tal_header.addr = -1;
> + tal_header.addr_string = std::move (gdb_dis_out.string
> ());
> + tal_header.addr_size = 0;
> + tal_header.insn.clear ();
> + asm_lines.push_back (std::move (tal_header));
> +
> + gdb_dis_out.clear ();
> + }
> +
> + fputs_styled (paddress (gdbarch, orig_pc),
> + address_style.style (), &gdb_dis_out);
> + fputs_filtered (" <", &gdb_dis_out);
> + if (unmapped)
> + fputs_filtered ("*", &gdb_dis_out);
> + fprintf_styled (&gdb_dis_out, address_style.style (),
> + "%+d", offset);
> + if (unmapped)
> + fputs_filtered ("*", &gdb_dis_out);
> + fputs_filtered (">", &gdb_dis_out);
> + tal.addr_string = std::move (gdb_dis_out.string ());
> + }
> + }
> + else
> + { /* If we're rendering for some other purpose than UI...
> + Fall back to legacy disassembly line style. */
> + print_address (gdbarch, orig_pc, &gdb_dis_out);
> + tal.addr_string = std::move (gdb_dis_out.string ());
> + }
> gdb_dis_out.clear ();
>
> if (addr_size != nullptr)
> @@ -342,7 +394,7 @@ tui_disasm_window::set_contents (struct gdbarch *arch,
> /* Get temporary table that will hold all strings (addr & insn). */
> std::vector<tui_asm_line> asm_lines;
> size_t addr_size = 0;
> - tui_disassemble (m_gdbarch, asm_lines, pc, max_lines, &addr_size);
> + tui_disassemble (m_gdbarch, asm_lines, pc, max_lines, &addr_size, true);
>
> /* Align instructions to the same column. */
> insn_pos = (1 + (addr_size / tab_len)) * tab_len;
>
> base-commit: 2f279a64a27bca5be4393e84cbb579e18ef4a4ad
> --
> 2.34.1
>
>
next prev parent reply other threads:[~2022-01-24 19:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-24 19:28 Simon Marchi via Gdb-patches
2022-01-24 19:39 ` Vasili Burdo via Gdb-patches [this message]
2022-01-24 19:40 ` Simon Marchi via Gdb-patches
2022-01-28 22:41 ` Andrew Burgess via Gdb-patches
2022-01-29 1:20 ` Simon Marchi via Gdb-patches
2022-01-29 8:04 ` Vasili Burdo via Gdb-patches
2022-01-30 2:17 ` Simon Marchi via Gdb-patches
2022-02-02 13:40 ` Andrew Burgess via Gdb-patches
2022-02-02 14:33 ` Simon Marchi via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CANacp62CARDC0Av48bHqr4ckDBB+avHH9VgDi-DWtkUGDy8hcQ@mail.gmail.com \
--to=gdb-patches@sourceware.org \
--cc=simon.marchi@efficios.com \
--cc=simon.marchi@polymtl.ca \
--cc=vasili.burdo@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox