From b469073e481379dc618c944743994b3a5f1ddf7e Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Jan 25 2010 17:13:16 +0000 Subject: - Enable loading a core file just as a single argument to /usr/bin/gdb. --- diff --git a/gdb-6.6-buildid-locate-core-as-arg.patch b/gdb-6.6-buildid-locate-core-as-arg.patch new file mode 100644 index 0000000..2dcf5b3 --- /dev/null +++ b/gdb-6.6-buildid-locate-core-as-arg.patch @@ -0,0 +1,179 @@ +http://sourceware.org/ml/gdb-patches/2010-01/msg00558.html +Subject: Re: [patch] print a more useful error message for "gdb core" + +[ Fixed up since the mail. ] + +On Thu, 21 Jan 2010 18:17:15 +0100, Doug Evans wrote: +> Not an exhaustive list, but if we go down the path of converting "gdb +> corefile" to "gdb -c corefile", then we also need to think about "file +> corefile" being converted to "core corefile" [or "target core +> corefile", "core" is apparently deprecated in favor of "target core"] +> and "target exec corefile" -> "target core corefile". Presumably +> "file corefile" (and "target exec corefile") would discard the +> currently selected executable. But maybe not. Will that be confusing +> for users? I don't know. + +While thinking about it overriding some GDB _commands_ was not my intention. + +There is a general assumption if I have a shell COMMAND and some FILE I can do +$ COMMAND FILE +and COMMAND will appropriately load the FILE. + +FSF GDB currently needs to specify also the executable file for core files +which already inhibits this intuitive expectation. OTOH with the build-id +locating patch which could allow such intuitive start notneeding the +executable file. Still it currently did not work due to the required "-c": +$ COMMAND -c COREFILE + +Entering "file", "core-file" or "attach" commands is already explicit enough +so that it IMO should do what the command name says without any +autodetections. The second command line argument +(captured_main->pid_or_core_arg) is also autodetected (for PID or CORE) but +neither "attach" accepts a core file nor "core-file" accepts a PID. + + +The patch makes sense only with the build-id patchset so this is not submit +for FSF GDB inclusion yet. I am fine with your patch (+/- Hui Zhu's pending +bfd_check_format_matches) as the patch below is its natural extension. + + +Sorry for the delay, +Jan + + +2010-01-25 Jan Kratochvil + + * exceptions.h (enum errors ): New. + * exec.c: Include exceptions.h. + (exec_file_attach ): Call throw_error (IS_CORE_ERROR, ...). + * main.c (exec_or_core_file_attach): New. + (captured_main ): Set also corearg. + (captured_main ): New variable func. + Call exec_or_core_file_attach if COREARG matches EXECARG. Call + symbol_file_add_main only if CORE_BFD remained NULL. + +Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html +2010-01-20 Doug Evans + + * exec.c (exec_file_attach): Print a more useful error message if the + user did "gdb core". + +--- a/gdb/exceptions.h ++++ b/gdb/exceptions.h +@@ -78,6 +78,9 @@ enum errors { + /* Feature is not supported in this copy of GDB. */ + UNSUPPORTED_ERROR, + ++ /* Attempt to load a core file as executable. */ ++ IS_CORE_ERROR, ++ + /* Add more errors here. */ + NR_ERRORS + }; +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -34,6 +34,7 @@ + #include "arch-utils.h" + #include "gdbthread.h" + #include "progspace.h" ++#include "exceptions.h" + + #include + #include "readline/readline.h" +@@ -253,6 +254,19 @@ exec_file_attach (char *filename, int from_tty) + scratch_pathname = xstrdup (scratch_pathname); + cleanups = make_cleanup (xfree, scratch_pathname); + ++ /* If the user accidentally did "gdb core", print a useful ++ error message. */ ++ if (bfd_check_format (exec_bfd, bfd_core)) ++ { ++ /* Make sure to close exec_bfd, or else "run" might try to use ++ it. */ ++ exec_close (); ++ throw_error (IS_CORE_ERROR, ++ _("\"%s\" is a core file.\n" ++ "Please specify an executable to debug."), ++ scratch_pathname); ++ } ++ + if (!bfd_check_format (exec_bfd, bfd_object)) + { + /* Make sure to close exec_bfd, or else "run" might try to use +--- a/gdb/main.c ++++ b/gdb/main.c +@@ -240,6 +240,36 @@ captured_command_loop (void *data) + return 1; + } + ++/* Call exec_file_attach. If it detected FILENAME is a core file call ++ core_file_command. Print the original exec_file_attach error only if ++ core_file_command failed to find a matching executable. */ ++ ++static void ++exec_or_core_file_attach (char *filename, int from_tty) ++{ ++ volatile struct gdb_exception e; ++ ++ gdb_assert (exec_bfd == NULL); ++ ++ TRY_CATCH (e, RETURN_MASK_ALL) ++ { ++ exec_file_attach (filename, from_tty); ++ } ++ if (e.reason < 0) ++ { ++ if (e.error == IS_CORE_ERROR) ++ { ++ core_file_command (filename, from_tty); ++ ++ /* Iff the core file found its executable suppress the error message ++ from exec_file_attach. */ ++ if (exec_bfd != NULL) ++ return; ++ } ++ throw_exception (e); ++ } ++} ++ + static int + captured_main (void *data) + { +@@ -668,6 +698,8 @@ extern int gdbtk_test (char *); + { + symarg = argv[optind]; + execarg = argv[optind]; ++ if (optind + 1 == argc && corearg == NULL) ++ corearg = argv[optind]; + optind++; + } + +@@ -800,10 +831,25 @@ Excess command line arguments ignored. (%s%s)\n"), + && symarg != NULL + && strcmp (execarg, symarg) == 0) + { ++ catch_command_errors_ftype *func; ++ ++ /* Call exec_or_core_file_attach only if the file was specified as ++ a command line argument (and not an a command line option). */ ++ if (corearg != NULL && strcmp (corearg, execarg) == 0) ++ { ++ func = exec_or_core_file_attach; ++ corearg = NULL; ++ } ++ else ++ func = exec_file_attach; ++ + /* 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, RETURN_MASK_ALL)) ++ open it, better only print one error message. ++ catch_command_errors returns non-zero on success! ++ Do not load EXECARG as a symbol file if it has been already processed ++ as a core file. */ ++ if (catch_command_errors (func, execarg, !batch, RETURN_MASK_ALL) ++ && core_bfd == NULL) + catch_command_errors (symbol_file_add_main, symarg, !batch, RETURN_MASK_ALL); + } + else diff --git a/gdb-archer-pie-addons.patch b/gdb-archer-pie-addons.patch index ae154ad..2badb2f 100644 --- a/gdb-archer-pie-addons.patch +++ b/gdb-archer-pie-addons.patch @@ -55,10 +55,10 @@ Index: gdb-7.0.50.20100115/gdb/exec.c =================================================================== --- gdb-7.0.50.20100115.orig/gdb/exec.c 2010-01-15 21:35:14.000000000 +0100 +++ gdb-7.0.50.20100115/gdb/exec.c 2010-01-15 21:47:19.000000000 +0100 -@@ -34,6 +34,7 @@ - #include "arch-utils.h" +@@ -35,6 +35,7 @@ #include "gdbthread.h" #include "progspace.h" + #include "exceptions.h" +#include "solib.h" #include diff --git a/gdb.spec b/gdb.spec index 70c01aa..8986467 100644 --- a/gdb.spec +++ b/gdb.spec @@ -36,7 +36,7 @@ Version: 7.0.50.20100121 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 8%{?_with_upstream:.upstream}%{dist} +Release: 9%{?_with_upstream:.upstream}%{dist} License: GPLv3+ Group: Development/Debuggers @@ -287,6 +287,7 @@ Patch271: gdb-6.5-bz243845-stale-testing-zombie-test.patch # New locating of the matching binaries from the pure core file (build-id). Patch274: gdb-6.6-buildid-locate.patch Patch353: gdb-6.6-buildid-locate-rpm.patch +Patch415: gdb-6.6-buildid-locate-core-as-arg.patch # Fix displaying of numeric char arrays as strings (BZ 224128). Patch282: gdb-6.7-charsign-test.patch @@ -641,6 +642,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch271 -p1 %patch274 -p1 %patch353 -p1 +%patch415 -p1 %patch282 -p1 %patch284 -p1 %patch287 -p1 @@ -1018,6 +1020,9 @@ fi %endif %changelog +* Mon Jan 25 2010 Jan Kratochvil - 7.0.50.20100121-9.fc13 +- Enable loading a core file just as a single argument to /usr/bin/gdb. + * Sun Jan 24 2010 Jan Kratochvil - 7.0.50.20100121-8.fc13 - testsuite: Fix gdb.arch/i386-bp_permanent.exp regression