[gdb/cli] Add ignore-errors command While trying to reproduce a failing test-case from the testsuite on the command line using a gdb command script, I ran into the problem that a command failed which stopped script execution. I could work around this by splitting the script at each error, but I realized it would be nice if I could tell gdb to ignore the error. A python workaround ignore-errors exists, mentioned here ( https://sourceware.org/legacy-ml/gdb/2010-06/msg00100.html ), which is already supplied by distros like Fedora and openSUSE. FTR, a more elaborate try-catch solution was posted here ( https://sourceware.org/bugzilla/show_bug.cgi?id=8487 ). This patch adds native ignore-errors support (so no python needed). So with this script: ... $ cat script.gdb ignore-errors run echo here ... we have: ... $ gdb -q -batch -x script.gdb No executable file specified. Use the "file" or "exec-file" command. here$ ... Note that quit is not caught: ... $ gdb.sh -q (gdb) ignore-errors quit $ ... which is the same behaviour as with the python implementation. gdb/ChangeLog: 2021-05-18 Tom de Vries * cli/cli-cmds.c (ignore_errors_command_completer) (ignore_errors_command): New function. (_initialize_cli_cmds): Add "ignore-errors" cmd. --- gdb/cli/cli-cmds.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 0bf418e510e..c2c3ee49eb3 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -39,6 +39,7 @@ #include "gdbsupport/filestuff.h" #include "location.h" #include "block.h" +#include "event-top.h" #include "ui-out.h" #include "interps.h" @@ -2249,6 +2250,34 @@ gdb_maint_setting_str_internal_fn (struct gdbarch *gdbarch, gdbarch); } +/* Completer for "ignore-errors". */ + +static void +ignore_errors_command_completer (cmd_list_element *ignore, + completion_tracker &tracker, + const char *text, const char * /*word*/) +{ + complete_nested_command_line (tracker, text); +} + +/* Implementation of the ignore-errors command. */ + +static void +ignore_errors_command (const char *args, int from_tty) +{ + try + { + execute_command (args, from_tty); + } + catch (const gdb_exception_error &ex) + { + exception_print (gdb_stderr, ex); + + /* See also execute_gdb_command. */ + async_enable_stdin (); + } +} + void _initialize_cli_cmds (); void _initialize_cli_cmds () @@ -2618,4 +2647,12 @@ when GDB is started."), GDBINIT); c = add_cmd ("source", class_support, source_command, source_help_text, &cmdlist); set_cmd_completer (c, filename_completer); + + const char *ignore_errors_help_text + = ("Execute a single command, ignoring all errors.\n" + "Only one-line commands are supported.\n" + "This is primarily useful in scripts."); + c = add_cmd ("ignore-errors", class_support, ignore_errors_command, + ignore_errors_help_text, &cmdlist); + set_cmd_completer (c, ignore_errors_command_completer); }