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

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