gdb/cli: add '.' as an argument for 'list' command

Currently, after the user has used the list command once, there is no
self-contained way to ask GDB to print the location where the inferior is
stopped.  The current best options require either using a separate
command to scope out where the inferior is stopped, or using "list *$pc"
requiring knowledge of GDB standard registers.  This commit adds a way
to do that using '.' as a new argument for the 'list' command.  If the
inferior isn't running, the command prints around the main function.

Because this necessitated having the inferior running and the test was
(seemingly unnecessarily) using printf in a non-essential way and it
would make the resulting log harder to read for no benefit, it was
replaced by a different statement.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Bruno Larsen
2023-06-15 12:14:22 +02:00
parent 0f819434f2
commit 3e3a1874fc
5 changed files with 78 additions and 3 deletions

View File

@@ -86,6 +86,10 @@
* The Ada 2022 Enum_Rep and Enum_Val attributes are now supported. * The Ada 2022 Enum_Rep and Enum_Val attributes are now supported.
* The 'list' command now accepts '.' as an argument, which tells GDB to
print the location where the inferior is stopped. If the inferior hasn't
started yet, the command will print around the main function.
* New commands * New commands
maintenance print record-instruction [ N ] maintenance print record-instruction [ N ]

View File

@@ -1234,14 +1234,14 @@ list_command (const char *arg, int from_tty)
const char *p; const char *p;
/* Pull in the current default source line if necessary. */ /* Pull in the current default source line if necessary. */
if (arg == NULL || ((arg[0] == '+' || arg[0] == '-') && arg[1] == '\0')) if (arg == NULL || ((arg[0] == '+' || arg[0] == '-' || arg[0] == '.') && arg[1] == '\0'))
{ {
set_default_source_symtab_and_line (); set_default_source_symtab_and_line ();
symtab_and_line cursal = get_current_source_symtab_and_line (); symtab_and_line cursal = get_current_source_symtab_and_line ();
/* If this is the first "list" since we've set the current /* If this is the first "list" since we've set the current
source line, center the listing around that line. */ source line, center the listing around that line. */
if (get_first_line_listed () == 0) if (get_first_line_listed () == 0 && (arg == nullptr || arg[0] != '.'))
{ {
list_around_line (arg, cursal); list_around_line (arg, cursal);
} }
@@ -1263,6 +1263,32 @@ list_command (const char *arg, int from_tty)
print_source_lines (cursal.symtab, range, 0); print_source_lines (cursal.symtab, range, 0);
} }
/* "l ." lists the default location again. */
else if (arg[0] == '.')
{
try
{
/* Find the current line by getting the PC of the currently
selected frame, and finding the line associated to it. */
frame_info_ptr frame = get_selected_frame (nullptr);
CORE_ADDR curr_pc = get_frame_pc (frame);
cursal = find_pc_line (curr_pc, 0);
}
catch (const gdb_exception &e)
{
/* If there was an exception above, it means the inferior
is not running, so reset the current source location to
the default. */
clear_current_source_symtab_and_line ();
set_default_source_symtab_and_line ();
cursal = get_current_source_symtab_and_line ();
}
list_around_line (arg, cursal);
/* Advance argument so just pressing "enter" after using "list ."
will print the following lines instead of the same lines again. */
arg++;
}
return; return;
} }
@@ -2770,6 +2796,7 @@ and send its output to SHELL_COMMAND."));
= add_com ("list", class_files, list_command, _("\ = add_com ("list", class_files, list_command, _("\
List specified function or line.\n\ List specified function or line.\n\
With no argument, lists ten more lines after or around previous listing.\n\ With no argument, lists ten more lines after or around previous listing.\n\
\"list .\" lists ten lines arond where the inferior is stopped.\n\
\"list -\" lists the ten lines before a previous ten-line listing.\n\ \"list -\" lists the ten lines before a previous ten-line listing.\n\
One argument specifies a line, and ten lines are listed around that line.\n\ One argument specifies a line, and ten lines are listed around that line.\n\
Two arguments with comma between specify starting and ending lines to list.\n\ Two arguments with comma between specify starting and ending lines to list.\n\

View File

@@ -9148,6 +9148,11 @@ Stack}), this prints lines centered around that line.
@item list - @item list -
Print lines just before the lines last printed. Print lines just before the lines last printed.
@item list .
Print the lines surrounding the location that is where the inferior
is stopped. If the inferior is not running, print around the main
function instead.
@end table @end table
@cindex @code{list}, how many lines to display @cindex @code{list}, how many lines to display

View File

@@ -400,6 +400,42 @@ proc test_list_invalid_args {} {
"second use of \"list +INVALID\"" "second use of \"list +INVALID\""
} }
proc test_list_current_location {} {
global binfile
# If the first "list" command that GDB runs is "list ." GDB may be
# unable to recognize that the inferior isn't running, so we should
# reload the inferior to test that condition.
clean_restart
gdb_file_cmd ${binfile}
# Ensure that we are printing 10 lines
if {![set_listsize 10]} {
return
}
# First guarantee that GDB prints around the main function correctly
gdb_test "list ." \
"1.*\r\n2\[ \t\]+\r\n3\[ \t\]+int main \[)(\]+.*5\[ \t\]+int x;.*" \
"list . with inferior not running"
if {![runto_main]} {
warning "couldn't start inferior"
return
}
# Walk forward some lines
gdb_test "until 15" ".*15.*foo.*"
# Test that the correct location is printed and that
# using just "list" will print the following lines.
gdb_test "list ." ".*" "list current line after starting"
gdb_test "list" ".*" "confirm we are printing the following lines"
# Test that list . will reset to current location
gdb_test "list ." ".*" "list around current line again"
gdb_test " " ".*" "testing repeated invocations with GDB's auto-repeat"
}
clean_restart clean_restart
gdb_file_cmd ${binfile} gdb_file_cmd ${binfile}
@@ -519,4 +555,7 @@ test_list "list -" 10 2 "7-8" "5-6"
# the current line. # the current line.
test_list "list -" 10 1 "7" "6" test_list "list -" 10 1 "7" "6"
# Test printing the location where the inferior is stopped.
test_list_current_location
remote_exec build "rm -f list0.h" remote_exec build "rm -f list0.h"

View File

@@ -7,7 +7,7 @@ void bar (int x)
- -
- */ - */
{ {
printf ("%d\n", x); x++;
long_line (); long_line ();
} }