diff options
author | Bruno Larsen <blarsen@redhat.com> | 2023-06-15 12:14:22 +0200 |
---|---|---|
committer | Bruno Larsen <blarsen@redhat.com> | 2023-07-14 10:58:17 +0200 |
commit | 3e3a1874fcec34bcf51b4baf4be09aebab561bff (patch) | |
tree | 28291dbcba9467ac6cf0a882be94b441b60d24a7 /gdb/cli | |
parent | 0f819434f242abef3cdbdd3b6f1d94317bc1e81a (diff) | |
download | gdb-3e3a1874fcec34bcf51b4baf4be09aebab561bff.zip gdb-3e3a1874fcec34bcf51b4baf4be09aebab561bff.tar.gz gdb-3e3a1874fcec34bcf51b4baf4be09aebab561bff.tar.bz2 |
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>
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-cmds.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 00977bc..44db019 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1234,14 +1234,14 @@ list_command (const char *arg, int from_tty) const char *p; /* 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 (); symtab_and_line cursal = get_current_source_symtab_and_line (); /* If this is the first "list" since we've set the current 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); } @@ -1263,6 +1263,32 @@ list_command (const char *arg, int from_tty) 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; } @@ -2770,6 +2796,7 @@ and send its output to SHELL_COMMAND.")); = add_com ("list", class_files, list_command, _("\ List specified function or line.\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\ 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\ |