Blame SOURCES/gdb-6.6-buildid-locate-core-as-arg.patch

b2f73e
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
b2f73e
From: Fedora GDB patches <invalid@email.com>
b2f73e
Date: Fri, 27 Oct 2017 21:07:50 +0200
b2f73e
Subject: gdb-6.6-buildid-locate-core-as-arg.patch
b2f73e
b2f73e
;;=push+jan
b2f73e
b2f73e
http://sourceware.org/ml/gdb-patches/2010-01/msg00558.html
b2f73e
b2f73e
[ Fixed up since the mail.  ]
b2f73e
b2f73e
On Thu, 21 Jan 2010 18:17:15 +0100, Doug Evans wrote:
b2f73e
> Not an exhaustive list, but if we go down the path of converting "gdb
b2f73e
> corefile" to "gdb -c corefile", then we also need to think about "file
b2f73e
> corefile" being converted to "core corefile" [or "target core
b2f73e
> corefile", "core" is apparently deprecated in favor of "target core"]
b2f73e
> and "target exec corefile" -> "target core corefile".  Presumably
b2f73e
> "file corefile" (and "target exec corefile") would discard the
b2f73e
> currently selected executable.  But maybe not.  Will that be confusing
b2f73e
> for users?  I don't know.
b2f73e
b2f73e
While thinking about it overriding some GDB _commands_ was not my intention.
b2f73e
b2f73e
There is a general assumption if I have a shell COMMAND and some FILE I can do
b2f73e
$ COMMAND FILE
b2f73e
and COMMAND will appropriately load the FILE.
b2f73e
b2f73e
FSF GDB currently needs to specify also the executable file for core files
b2f73e
which already inhibits this intuitive expectation.  OTOH with the build-id
b2f73e
locating patch which could allow such intuitive start  notneeding the
b2f73e
executable file.  Still it currently did not work due to the required "-c":
b2f73e
$ COMMAND -c COREFILE
b2f73e
b2f73e
Entering "file", "core-file" or "attach" commands is already explicit enough
b2f73e
so that it IMO should do what the command name says without any
b2f73e
autodetections.  The second command line argument
b2f73e
(captured_main->pid_or_core_arg) is also autodetected (for PID or CORE) but
b2f73e
neither "attach" accepts a core file nor "core-file" accepts a PID.
b2f73e
b2f73e
The patch makes sense only with the build-id patchset so this is not submit
b2f73e
for FSF GDB inclusion yet.  I am fine with your patch (+/- Hui Zhu's pending
b2f73e
bfd_check_format_matches) as the patch below is its natural extension.
b2f73e
b2f73e
Sorry for the delay,
b2f73e
Jan
b2f73e
b2f73e
2010-01-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
b2f73e
b2f73e
	* exceptions.h (enum errors <IS_CORE_ERROR>): New.
b2f73e
	* exec.c: Include exceptions.h.
b2f73e
	(exec_file_attach <bfd_core>): Call throw_error (IS_CORE_ERROR, ...).
b2f73e
	* main.c (exec_or_core_file_attach): New.
b2f73e
	(captured_main <optind < argc>): Set also corearg.
b2f73e
	(captured_main <strcmp (execarg, symarg) == 0>): New variable func.
b2f73e
	Call exec_or_core_file_attach if COREARG matches EXECARG.  Call
b2f73e
	symbol_file_add_main only if CORE_BFD remained NULL.
b2f73e
b2f73e
Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html
b2f73e
2010-01-20  Doug Evans  <dje@google.com>
b2f73e
b2f73e
	* exec.c (exec_file_attach): Print a more useful error message if the
b2f73e
	user did "gdb core".
b2f73e
b2f73e
diff --git a/gdb/exec.c b/gdb/exec.c
b2f73e
--- a/gdb/exec.c
b2f73e
+++ b/gdb/exec.c
b2f73e
@@ -18,6 +18,8 @@
b2f73e
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
b2f73e
 
b2f73e
 #include "defs.h"
b2f73e
+#include "arch-utils.h"
b2f73e
+#include "exceptions.h"
b2f73e
 #include "frame.h"
b2f73e
 #include "inferior.h"
b2f73e
 #include "target.h"
b2f73e
@@ -345,12 +347,27 @@ exec_file_attach (const char *filename, int from_tty)
b2f73e
 
b2f73e
       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
b2f73e
 	{
b2f73e
+	  int is_core;
b2f73e
+
b2f73e
+	  /* If the user accidentally did "gdb core", print a useful
b2f73e
+	     error message.  Check it only after bfd_object has been checked as
b2f73e
+	     a valid executable may get recognized for example also as
b2f73e
+	     "trad-core".  */
b2f73e
+	  is_core = bfd_check_format (exec_bfd, bfd_core);
b2f73e
+
b2f73e
 	  /* Make sure to close exec_bfd, or else "run" might try to use
b2f73e
 	     it.  */
b2f73e
 	  exec_close ();
b2f73e
-	  error (_("\"%s\": not in executable format: %s"),
b2f73e
-		 scratch_pathname,
b2f73e
-		 gdb_bfd_errmsg (bfd_get_error (), matching).c_str ());
b2f73e
+
b2f73e
+	  if (is_core != 0)
b2f73e
+	    throw_error (IS_CORE_ERROR,
b2f73e
+			 _("\"%s\" is a core file.\n"
b2f73e
+			   "Please specify an executable to debug."),
b2f73e
+			 scratch_pathname);
b2f73e
+	  else
b2f73e
+	    error (_("\"%ss\": not in executable format: %s"),
b2f73e
+		   scratch_pathname,
b2f73e
+		   gdb_bfd_errmsg (bfd_get_error (), matching).c_str ());
b2f73e
 	}
b2f73e
 
b2f73e
       if (build_section_table (exec_bfd, &sections, &sections_end))
b2f73e
diff --git a/gdb/gdbsupport/common-exceptions.h b/gdb/gdbsupport/common-exceptions.h
b2f73e
--- a/gdb/gdbsupport/common-exceptions.h
b2f73e
+++ b/gdb/gdbsupport/common-exceptions.h
b2f73e
@@ -106,6 +106,9 @@ enum errors {
b2f73e
      "_ERROR" is appended to the name.  */
b2f73e
   MAX_COMPLETIONS_REACHED_ERROR,
b2f73e
 
b2f73e
+  /* Attempt to load a core file as executable.  */
b2f73e
+  IS_CORE_ERROR,
b2f73e
+
b2f73e
   /* Add more errors here.  */
b2f73e
   NR_ERRORS
b2f73e
 };
b2f73e
diff --git a/gdb/main.c b/gdb/main.c
b2f73e
--- a/gdb/main.c
b2f73e
+++ b/gdb/main.c
b2f73e
@@ -467,6 +467,34 @@ struct cmdarg
b2f73e
   char *string;
b2f73e
 };
b2f73e
 
b2f73e
+/* Call exec_file_attach.  If it detected FILENAME is a core file call
b2f73e
+   core_file_command.  Print the original exec_file_attach error only if
b2f73e
+   core_file_command failed to find a matching executable.  */
b2f73e
+
b2f73e
+static void
b2f73e
+exec_or_core_file_attach (const char *filename, int from_tty)
b2f73e
+{
b2f73e
+  gdb_assert (exec_bfd == NULL);
b2f73e
+
b2f73e
+  try
b2f73e
+    {
b2f73e
+      exec_file_attach (filename, from_tty);
b2f73e
+    }
b2f73e
+  catch (gdb_exception_error &e)
b2f73e
+    {
b2f73e
+      if (e.error == IS_CORE_ERROR)
b2f73e
+	{
b2f73e
+	  core_file_command ((char *) filename, from_tty);
b2f73e
+
b2f73e
+	  /* Iff the core file found its executable suppress the error message
b2f73e
+	     from exec_file_attach.  */
b2f73e
+	  if (exec_bfd != NULL)
b2f73e
+	    return;
b2f73e
+	}
b2f73e
+      throw_exception (std::move (e));
b2f73e
+    }
b2f73e
+}
b2f73e
+
b2f73e
 static void
b2f73e
 captured_main_1 (struct captured_main_args *context)
b2f73e
 {
b2f73e
@@ -907,6 +935,8 @@ captured_main_1 (struct captured_main_args *context)
b2f73e
 	{
b2f73e
 	  symarg = argv[optind];
b2f73e
 	  execarg = argv[optind];
b2f73e
+	  if (optind + 1 == argc && corearg == NULL)
b2f73e
+	    corearg = argv[optind];
b2f73e
 	  optind++;
b2f73e
 	}
b2f73e
 
b2f73e
@@ -1063,12 +1093,25 @@ captured_main_1 (struct captured_main_args *context)
b2f73e
       && symarg != NULL
b2f73e
       && strcmp (execarg, symarg) == 0)
b2f73e
     {
b2f73e
+      catch_command_errors_const_ftype *func;
b2f73e
+
b2f73e
+      /* Call exec_or_core_file_attach only if the file was specified as
b2f73e
+	 a command line argument (and not an a command line option).  */
b2f73e
+      if (corearg != NULL && strcmp (corearg, execarg) == 0)
b2f73e
+	{
b2f73e
+	  func = exec_or_core_file_attach;
b2f73e
+	  corearg = NULL;
b2f73e
+	}
b2f73e
+      else
b2f73e
+	func = exec_file_attach;
b2f73e
+
b2f73e
       /* The exec file and the symbol-file are the same.  If we can't
b2f73e
          open it, better only print one error message.
b2f73e
-         catch_command_errors returns non-zero on success!  */
b2f73e
-      ret = catch_command_errors (exec_file_attach, execarg,
b2f73e
-				  !batch_flag);
b2f73e
-      if (ret != 0)
b2f73e
+         catch_command_errors returns non-zero on success!
b2f73e
+	 Do not load EXECARG as a symbol file if it has been already processed
b2f73e
+	 as a core file.  */
b2f73e
+      ret = catch_command_errors (func, execarg, !batch_flag);
b2f73e
+      if (ret != 0 && core_bfd == NULL)
b2f73e
 	ret = catch_command_errors (symbol_file_add_main_adapter,
b2f73e
 				    symarg, !batch_flag);
b2f73e
     }