diff options
author | Gary Benson <gbenson@redhat.com> | 2018-08-29 16:11:50 +0100 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2018-08-29 16:11:50 +0100 |
commit | b0f492b90f3d13da8ac80437e6ecb9a87db4a75b (patch) | |
tree | 1b77332c0e4f9f694b3a5b8702e2a8ceb17ebed0 /gdb/main.c | |
parent | 2362e7f76adb395df19c867cd27c75f77a0ade6f (diff) | |
download | gdb-b0f492b90f3d13da8ac80437e6ecb9a87db4a75b.zip gdb-b0f492b90f3d13da8ac80437e6ecb9a87db4a75b.tar.gz gdb-b0f492b90f3d13da8ac80437e6ecb9a87db4a75b.tar.bz2 |
Indicate batch mode failures by exiting with nonzero status
This commit causes GDB in batch mode to exit with nonzero status
if the last command to be executed fails.
gdb/ChangeLog:
PR gdb/13000:
* gdb/main.c (captured_main_1): Exit with nonzero status
in batch mode if the last command to be executed failed.
* NEWS: Mention the above.
gdb/testsuite/ChangeLog:
PR gdb/13000:
* gdb.base/batch-exit-status.exp: New file.
* gdb.base/batch-exit-status.good-commands: Likewise.
* gdb.base/batch-exit-status.bad-commands: Likewise.
Diffstat (limited to 'gdb/main.c')
-rw-r--r-- | gdb/main.c | 78 |
1 files changed, 47 insertions, 31 deletions
@@ -486,6 +486,7 @@ captured_main_1 (struct captured_main_args *context) int i; int save_auto_load; struct objfile *objfile; + int ret = 1; #ifdef HAVE_USEFUL_SBRK /* Set this before constructing scoped_command_stats. */ @@ -986,7 +987,7 @@ captured_main_1 (struct captured_main_args *context) processed; it sets global parameters, which are independent of what file you are debugging or what directory you are in. */ if (system_gdbinit && !inhibit_gdbinit) - catch_command_errors (source_script, system_gdbinit, 0); + ret = catch_command_errors (source_script, system_gdbinit, 0); /* Read and execute $HOME/.gdbinit file, if it exists. This is done *before* all the command line arguments are processed; it sets @@ -994,7 +995,7 @@ captured_main_1 (struct captured_main_args *context) debugging or what directory you are in. */ if (home_gdbinit && !inhibit_gdbinit && !inhibit_home_gdbinit) - catch_command_errors (source_script, home_gdbinit, 0); + ret = catch_command_errors (source_script, home_gdbinit, 0); /* Process '-ix' and '-iex' options early. */ for (i = 0; i < cmdarg_vec.size (); i++) @@ -1004,12 +1005,12 @@ captured_main_1 (struct captured_main_args *context) switch (cmdarg_p.type) { case CMDARG_INIT_FILE: - catch_command_errors (source_script, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (source_script, cmdarg_p.string, + !batch_flag); break; case CMDARG_INIT_COMMAND: - catch_command_errors (execute_command, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (execute_command, cmdarg_p.string, + !batch_flag); break; } } @@ -1017,11 +1018,11 @@ captured_main_1 (struct captured_main_args *context) /* Now perform all the actions indicated by the arguments. */ if (cdarg != NULL) { - catch_command_errors (cd_command, cdarg, 0); + ret = catch_command_errors (cd_command, cdarg, 0); } for (i = 0; i < dirarg.size (); i++) - catch_command_errors (directory_switch, dirarg[i], 0); + ret = catch_command_errors (directory_switch, dirarg[i], 0); /* Skip auto-loading section-specified scripts until we've sourced local_gdbinit (which is often used to augment the source search @@ -1036,19 +1037,20 @@ captured_main_1 (struct captured_main_args *context) /* The exec file and the symbol-file are the same. If we can't open it, better only print one error message. catch_command_errors returns non-zero on success! */ - if (catch_command_errors (exec_file_attach, execarg, - !batch_flag)) - catch_command_errors (symbol_file_add_main_adapter, symarg, - !batch_flag); + ret = catch_command_errors (exec_file_attach, execarg, + !batch_flag); + if (ret != 0) + ret = catch_command_errors (symbol_file_add_main_adapter, + symarg, !batch_flag); } else { if (execarg != NULL) - catch_command_errors (exec_file_attach, execarg, - !batch_flag); + ret = catch_command_errors (exec_file_attach, execarg, + !batch_flag); if (symarg != NULL) - catch_command_errors (symbol_file_add_main_adapter, symarg, - !batch_flag); + ret = catch_command_errors (symbol_file_add_main_adapter, + symarg, !batch_flag); } if (corearg && pidarg) @@ -1056,9 +1058,14 @@ captured_main_1 (struct captured_main_args *context) "a core file at the same time.")); if (corearg != NULL) - catch_command_errors (core_file_command, corearg, !batch_flag); + { + ret = catch_command_errors (core_file_command, corearg, + !batch_flag); + } else if (pidarg != NULL) - catch_command_errors (attach_command, pidarg, !batch_flag); + { + ret = catch_command_errors (attach_command, pidarg, !batch_flag); + } else if (pid_or_core_arg) { /* The user specified 'gdb program pid' or gdb program core'. @@ -1067,14 +1074,20 @@ captured_main_1 (struct captured_main_args *context) if (isdigit (pid_or_core_arg[0])) { - if (catch_command_errors (attach_command, pid_or_core_arg, - !batch_flag) == 0) - catch_command_errors (core_file_command, pid_or_core_arg, - !batch_flag); + ret = catch_command_errors (attach_command, pid_or_core_arg, + !batch_flag); + if (ret == 0) + ret = catch_command_errors (core_file_command, + pid_or_core_arg, + !batch_flag); + } + else + { + /* Can't be a pid, better be a corefile. */ + ret = catch_command_errors (core_file_command, + pid_or_core_arg, + !batch_flag); } - else /* Can't be a pid, better be a corefile. */ - catch_command_errors (core_file_command, pid_or_core_arg, - !batch_flag); } if (ttyarg != NULL) @@ -1098,7 +1111,7 @@ captured_main_1 (struct captured_main_args *context) { auto_load_local_gdbinit_loaded = 1; - catch_command_errors (source_script, local_gdbinit, 0); + ret = catch_command_errors (source_script, local_gdbinit, 0); } } @@ -1118,12 +1131,12 @@ captured_main_1 (struct captured_main_args *context) switch (cmdarg_p.type) { case CMDARG_FILE: - catch_command_errors (source_script, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (source_script, cmdarg_p.string, + !batch_flag); break; case CMDARG_COMMAND: - catch_command_errors (execute_command, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (execute_command, cmdarg_p.string, + !batch_flag); break; } } @@ -1134,8 +1147,11 @@ captured_main_1 (struct captured_main_args *context) if (batch_flag) { + int error_status = EXIT_FAILURE; + int *exit_arg = ret == 0 ? &error_status : NULL; + /* We have hit the end of the batch file. */ - quit_force (NULL, 0); + quit_force (exit_arg, 0); } } |