gdb/cli: fixes to newly added "list ." command

After the series that added this command was pushed, Pedro mentioned
that the news description could easily be misinterpreted, as well as
some code and test improvements that should be made.

While fixing the test, I realized that code repetition wasn't
happening as it should, so I took care of that too.

Approved-By: Andrew Burgess <aburgess@redhat.com>
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
This commit is contained in:
Guinevere Larsen
2023-09-19 14:06:49 +02:00
parent 5d69d9edc4
commit 12f567bcb6
4 changed files with 28 additions and 25 deletions

View File

@@ -90,8 +90,9 @@
expression parser. expression parser.
* The 'list' command now accepts '.' as an argument, which tells GDB to * 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 print the location around the point of execution within the current frame.
started yet, the command will print around the main function. If the inferior hasn't started yet, the command will print around the
beginning of the 'main' function.
* Using the 'list' command with no arguments in a situation where the * 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 command would attempt to list past the end of the file now warns the

View File

@@ -1272,10 +1272,10 @@ 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. */ /* "list ." lists the default location again. */
else if (arg[0] == '.') else if (arg[0] == '.')
{ {
try if (target_has_stack ())
{ {
/* Find the current line by getting the PC of the currently /* Find the current line by getting the PC of the currently
selected frame, and finding the line associated to it. */ selected frame, and finding the line associated to it. */
@@ -1283,19 +1283,19 @@ list_command (const char *arg, int from_tty)
CORE_ADDR curr_pc = get_frame_pc (frame); CORE_ADDR curr_pc = get_frame_pc (frame);
cursal = find_pc_line (curr_pc, 0); cursal = find_pc_line (curr_pc, 0);
} }
catch (const gdb_exception &e) else
{ {
/* If there was an exception above, it means the inferior /* The inferior is not running, so reset the current source
is not running, so reset the current source location to location to the default (usually the main function). */
the default. */
clear_current_source_symtab_and_line (); clear_current_source_symtab_and_line ();
set_default_source_symtab_and_line (); set_default_source_symtab_and_line ();
cursal = get_current_source_symtab_and_line (); cursal = get_current_source_symtab_and_line ();
} }
list_around_line (arg, cursal); list_around_line (arg, cursal);
/* Advance argument so just pressing "enter" after using "list ." /* Set the repeat args so just pressing "enter" after using "list ."
will print the following lines instead of the same lines again. */ will print the following lines instead of the same lines again. */
arg++; if (from_tty)
set_repeat_arguments ("");
} }
return; return;
@@ -2805,9 +2805,9 @@ 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 following a previous ten-line listing.\n\ \"list +\" lists the ten lines following a previous ten-line listing.\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\
\"list .\" lists ten lines around the point of execution in the current frame.\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\
Lines can be specified in these ways:\n\ Lines can be specified in these ways:\n\

View File

@@ -9212,9 +9212,9 @@ Same as using with no arguments.
Print lines just before the lines last printed. Print lines just before the lines last printed.
@item list . @item list .
Print the lines surrounding the location that is where the inferior Print the lines surrounding the point of execution within the
is stopped. If the inferior is not running, print around the main currently selected frame. If the inferior is not running, print lines
function instead. around the start of 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

@@ -402,18 +402,15 @@ proc test_list_invalid_args {} {
proc test_list_current_location {} { proc test_list_current_location {} {
global binfile global binfile
# If the first "list" command that GDB runs is "list ." GDB may be # Reload the inferior to test "list ." before the inferior is started.
# 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} gdb_file_cmd ${binfile}
# Ensure that we are printing 10 lines # Ensure that we are printing 10 lines.
if {![set_listsize 10]} { if {![set_listsize 10]} {
return return
} }
# First guarantee that GDB prints around the main function correctly # First guarantee that GDB prints around the main function correctly.
gdb_test "list ." \ gdb_test "list ." \
"1.*\r\n2\[ \t\]+\r\n3\[ \t\]+int main \[)(\]+.*5\[ \t\]+int x;.*" \ "1.*\r\n2\[ \t\]+\r\n3\[ \t\]+int main \[)(\]+.*5\[ \t\]+int x;.*" \
"list . with inferior not running" "list . with inferior not running"
@@ -423,17 +420,22 @@ proc test_list_current_location {} {
return return
} }
# Walk forward some lines # Walk forward some lines.
gdb_test "until 15" ".*15.*foo.*" gdb_test "until 15" ".*15.*foo.*"
# Test that the correct location is printed and that # Test that the correct location is printed and that
# using just "list" will print the following lines. # using just "list" will print the following lines.
gdb_test "list ." ".*" "list current line after starting" gdb_test "list ." "10\[ \t\]+foo \(.*\);.*19\[ \t\]+foo \(.*\);" \
gdb_test "list" ".*" "confirm we are printing the following lines" "list current line after starting"
gdb_test "list" "20\[ \t\]+foo \(.*\);.*29\[ \t\]+foo \(.*\);" \
"confirm we are printing the following lines"
# Test that list . will reset to current location # Test that list . will reset to current location
gdb_test "list ." ".*" "list around current line again" # and that an empty line lists the following lines.
gdb_test " " ".*" "testing repeated invocations with GDB's auto-repeat" gdb_test "list ." "10\[ \t\]+foo \(.*\);.*19\[ \t\]+foo \(.*\);" \
"list around current line again"
gdb_test " " "20\[ \t\]+foo \(.*\);.*29\[ \t\]+foo \(.*\);" \
"testing repeated invocations with GDB's auto-repeat"
} }
clean_restart clean_restart