aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/NEWS5
-rw-r--r--gdb/cli/cli-cmds.c17
-rw-r--r--gdb/doc/gdb.texinfo4
-rw-r--r--gdb/source.c16
-rw-r--r--gdb/source.h7
-rw-r--r--gdb/testsuite/gdb.base/list.exp8
6 files changed, 48 insertions, 9 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index c5bbd4f..ac5dc42 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -90,6 +90,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 44db019..3a1902a 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 7619efe..20c9b24 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 9997ccc..08adc66 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 ();
+}
+
/* Print info on range of pc's in a specified line. */
diff --git a/gdb/source.h b/gdb/source.h
index 8fbc365..be80e00 100644
--- a/gdb/source.h
+++ b/gdb/source.h
@@ -192,6 +192,13 @@ private:
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 ed178a1..5823559 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 {} {