public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Bruno Larsen <blarsen@redhat.com>
To: gdb-patches@sourceware.org
Cc: Bruno Larsen <blarsen@redhat.com>
Subject: [PATCH v4 3/4] gdb/cli: Improve UX when using list with no args
Date: Thu, 13 Jul 2023 12:24:10 +0200	[thread overview]
Message-ID: <20230713102411.2279542-4-blarsen@redhat.com> (raw)
In-Reply-To: <20230713102411.2279542-1-blarsen@redhat.com>

When using "list" with no arguments, GDB will first print the lines
around where the inferior is stopped, then print the next N lines until
reaching the end of file, at which point it wanrs the user "Line X out
of range, file Y only has X-1 lines.".  This is usually desireable, but
if the user can no longer see the original line, they may have forgotten
the current line or that a list command was used at all, making GDB's
error message look cryptic. It was reported in bugzilla as PR cli/30497.

This commit improves the user experince by changing the behavior of
"list" slightly when a user passes no arguments.  It now prints that the
end of the file has been reached and recommends that the user use the
command "list ." instead.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30497
---
 gdb/NEWS                        |  5 +++++
 gdb/cli/cli-cmds.c              | 17 +++++++++++++----
 gdb/doc/gdb.texinfo             |  4 +++-
 gdb/source.c                    | 16 ++++++++++++++++
 gdb/source.h                    |  7 +++++++
 gdb/testsuite/gdb.base/list.exp |  8 ++++----
 6 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index eef440a5242..df26606c9a8 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -88,6 +88,11 @@
   print the location where the inferior is stopped.  If the inferior hasn't
   started yet, the command will print around the main function.
 
+* Using the 'list' command with no arguments in a situation where the
+  command would attempt to list past the end of the file now warns the
+  user that the end of file has been reached, refers the user to the
+  newly added '.' argument
+
 * New commands
 
 maintenance print record-instruction [ N ]
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 1c459afdc97..5f5933e7963 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1246,10 +1246,19 @@ list_command (const char *arg, int from_tty)
 	  list_around_line (arg, cursal);
 	}
 
-      /* "l" or "l +" lists next ten lines.  */
-      else if (arg == NULL || arg[0] == '+')
-	print_source_lines (cursal.symtab,
-			    source_lines_range (cursal.line), 0);
+      /* "l" and "l +" lists the next few lines, unless we're listing past
+	 the end of the file.  */
+      else if (arg == nullptr || arg[0] == '+')
+	{
+	  if (last_symtab_line (cursal.symtab) >= cursal.line)
+	    print_source_lines (cursal.symtab,
+				source_lines_range (cursal.line), 0);
+	  else
+	    {
+	      error (_("End of the file was already reached, use \"list .\" to"
+		       " list the current location again"));
+	    }
+	}
 
       /* "l -" lists previous ten lines, the ones before the ten just
 	 listed.  */
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 7619efe3de9..20c9b24400d 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9144,7 +9144,9 @@ Print more lines.  If the last lines printed were printed with a
 @code{list} command, this prints lines following the last lines
 printed; however, if the last line printed was a solitary line printed
 as part of displaying a stack frame (@pxref{Stack, ,Examining the
-Stack}), this prints lines centered around that line.
+Stack}), this prints lines centered around that line.  If no
+@code{list} command has been used and no solitary line was printed,
+it prints the lines around the function @code{main}.
 
 @item list -
 Print lines just before the lines last printed.
diff --git a/gdb/source.c b/gdb/source.c
index 9997cccb31b..08adc6671b7 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1484,6 +1484,22 @@ print_source_lines (struct symtab *s, source_lines_range line_range,
 			   line_range.stopline (), flags);
 }
 
+/* See source.h.  */
+
+int
+last_symtab_line (struct symtab *s)
+{
+  const std::vector<off_t> *offsets;
+
+  /* Try to get the offsets for the start of each line.  */
+  if (!g_source_cache.get_line_charpos (s, &offsets))
+    return false;
+  if (offsets == nullptr)
+    return false;
+
+  return offsets->size ();
+}
+
 
 \f
 /* Print info on range of pc's in a specified line.  */
diff --git a/gdb/source.h b/gdb/source.h
index 8fbc365680d..be80e003890 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -192,6 +192,13 @@ class source_lines_range
   int m_stopline;
 };
 
+/* Get the number of the last line in the given symtab.  */
+extern int last_symtab_line (struct symtab *s);
+
+/* Check if the line LINE can be found in the symtab S, so that it can be
+   printed.  */
+extern bool can_print_line (struct symtab *s, int line);
+
 /* Variation of previous print_source_lines that takes a range instead of a
    start and end line number.  */
 extern void print_source_lines (struct symtab *s, source_lines_range r,
diff --git a/gdb/testsuite/gdb.base/list.exp b/gdb/testsuite/gdb.base/list.exp
index ed178a1dd95..582355996b0 100644
--- a/gdb/testsuite/gdb.base/list.exp
+++ b/gdb/testsuite/gdb.base/list.exp
@@ -175,8 +175,8 @@ proc_with_prefix test_list_forward {} {
 	"list 25-34"
     gdb_test "list" "35\[ \t\]+foo \\(.*\\);.*${last_line_re}" \
 	"list 35-42"
-    gdb_test "list" "Line number 44 out of range; \[^\r\n\]+ has 43 lines\." \
-	"end of file error after \"list\" command"
+    gdb_test "list" "End of the file was already reached, use \"list .\" to list the current location again" \
+	"list past end of file"
 }
 
 # Test that repeating the list linenum command doesn't print the same
@@ -194,8 +194,8 @@ proc_with_prefix test_repeat_list_command {} {
 	"list 25-34"
     gdb_test " " "35\[ \t\]+foo \\(.*\\);.*${last_line_re}" \
 	"list 35-42"
-    gdb_test "list" "Line number 44 out of range; \[^\r\n\]+ has 43 lines\." \
-	"end of file error after using 'return' to repeat the list command"
+    gdb_test "list" "End of the file was already reached, use \"list .\" to list the current location again" \
+	"list past end of file"
 }
 
 proc_with_prefix test_list_backwards {} {
-- 
2.41.0


  parent reply	other threads:[~2023-07-13 10:24 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-13 10:24 [PATCH v4 0/4] Small changes to "list" command Bruno Larsen
2023-07-13 10:24 ` [PATCH v4 1/4] gdb/cli: Factor out code to list lines around a given line Bruno Larsen
2023-07-13 16:53   ` Tom Tromey
2023-07-13 10:24 ` [PATCH v4 2/4] gdb/cli: add '.' as an argument for 'list' command Bruno Larsen
2023-07-13 11:05   ` Eli Zaretskii
2023-07-13 16:53   ` Tom Tromey
2023-07-14 17:50   ` Pedro Alves
2023-07-17  8:21     ` Bruno Larsen
2023-07-17  8:44       ` Andrew Burgess
2023-07-17 14:14       ` Pedro Alves
2023-07-18 11:21     ` [PATCH] gdb/cli: fixes to newly added "list ." command Bruno Larsen
2023-07-18 12:54       ` Eli Zaretskii
2023-07-18 13:40         ` Bruno Larsen
2023-07-18 16:17           ` Eli Zaretskii
2023-07-18 13:43       ` Pedro Alves
2023-07-18 14:55         ` Bruno Larsen
2023-07-21 10:26       ` [PATCH v2] " Bruno Larsen
2023-07-21 11:05         ` Eli Zaretskii
2023-08-04  8:37         ` [PING][PATCH " Bruno Larsen
2023-08-23 10:03           ` [PINGv2][PATCH " Guinevere Larsen
2023-08-23 15:00         ` [PATCH " Andrew Burgess
2023-08-28 15:50         ` [PATCH v3] " Guinevere Larsen
2023-09-14 13:00           ` [PING][PATCH " Guinevere Larsen
2023-09-18 13:16           ` [PATCH " Andrew Burgess
2023-09-19  9:06           ` [PATCH v4] " Guinevere Larsen
2023-09-19 11:27             ` Eli Zaretskii
2023-09-19 12:07               ` Guinevere Larsen
2023-07-13 10:24 ` Bruno Larsen [this message]
2023-07-13 11:06   ` [PATCH v4 3/4] gdb/cli: Improve UX when using list with no args Eli Zaretskii
2023-07-13 17:41   ` Keith Seitz
2023-07-13 10:24 ` [PATCH v4 4/4] gdb/doc: document '+' argument for 'list' command Bruno Larsen
2023-07-13 17:35   ` Keith Seitz
2023-07-13 21:30     ` Matt Rice
2023-07-14  8:53       ` Bruno Larsen
2023-07-14 16:30         ` Tom Tromey
2023-07-14 21:30           ` Matt Rice
2023-07-13 17:31 ` [PATCH v4 0/4] Small changes to "list" command Tom Tromey

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=20230713102411.2279542-4-blarsen@redhat.com \
    --to=blarsen@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).