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

2c2fa1
http://sourceware.org/ml/gdb-patches/2010-01/msg00558.html
2c2fa1
Subject: Re: [patch] print a more useful error message for "gdb core"
2c2fa1
2c2fa1
[ Fixed up since the mail.  ]
2c2fa1
2c2fa1
On Thu, 21 Jan 2010 18:17:15 +0100, Doug Evans wrote:
2c2fa1
> Not an exhaustive list, but if we go down the path of converting "gdb
2c2fa1
> corefile" to "gdb -c corefile", then we also need to think about "file
2c2fa1
> corefile" being converted to "core corefile" [or "target core
2c2fa1
> corefile", "core" is apparently deprecated in favor of "target core"]
2c2fa1
> and "target exec corefile" -> "target core corefile".  Presumably
2c2fa1
> "file corefile" (and "target exec corefile") would discard the
2c2fa1
> currently selected executable.  But maybe not.  Will that be confusing
2c2fa1
> for users?  I don't know.
2c2fa1
2c2fa1
While thinking about it overriding some GDB _commands_ was not my intention.
2c2fa1
2c2fa1
There is a general assumption if I have a shell COMMAND and some FILE I can do
2c2fa1
$ COMMAND FILE
2c2fa1
and COMMAND will appropriately load the FILE.
2c2fa1
2c2fa1
FSF GDB currently needs to specify also the executable file for core files
2c2fa1
which already inhibits this intuitive expectation.  OTOH with the build-id
2c2fa1
locating patch which could allow such intuitive start  notneeding the
2c2fa1
executable file.  Still it currently did not work due to the required "-c":
2c2fa1
$ COMMAND -c COREFILE
2c2fa1
2c2fa1
Entering "file", "core-file" or "attach" commands is already explicit enough
2c2fa1
so that it IMO should do what the command name says without any
2c2fa1
autodetections.  The second command line argument
2c2fa1
(captured_main->pid_or_core_arg) is also autodetected (for PID or CORE) but
2c2fa1
neither "attach" accepts a core file nor "core-file" accepts a PID.
2c2fa1
2c2fa1
2c2fa1
The patch makes sense only with the build-id patchset so this is not submit
2c2fa1
for FSF GDB inclusion yet.  I am fine with your patch (+/- Hui Zhu's pending
2c2fa1
bfd_check_format_matches) as the patch below is its natural extension.
2c2fa1
2c2fa1
2c2fa1
Sorry for the delay,
2c2fa1
Jan
2c2fa1
2c2fa1
2c2fa1
2010-01-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
2c2fa1
2c2fa1
	* exceptions.h (enum errors <IS_CORE_ERROR>): New.
2c2fa1
	* exec.c: Include exceptions.h.
2c2fa1
	(exec_file_attach <bfd_core>): Call throw_error (IS_CORE_ERROR, ...).
2c2fa1
	* main.c (exec_or_core_file_attach): New.
2c2fa1
	(captured_main <optind < argc>): Set also corearg.
2c2fa1
	(captured_main <strcmp (execarg, symarg) == 0>): New variable func.
2c2fa1
	Call exec_or_core_file_attach if COREARG matches EXECARG.  Call
2c2fa1
	symbol_file_add_main only if CORE_BFD remained NULL.
2c2fa1
2c2fa1
Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html
2c2fa1
2010-01-20  Doug Evans  <dje@google.com>
2c2fa1
2c2fa1
	* exec.c (exec_file_attach): Print a more useful error message if the
2c2fa1
	user did "gdb core".
2c2fa1
2c2fa1
Index: gdb-7.5.91.20130323/gdb/exceptions.h
2c2fa1
===================================================================
2c2fa1
--- gdb-7.5.91.20130323.orig/gdb/exceptions.h	2013-03-22 21:41:45.000000000 +0100
2c2fa1
+++ gdb-7.5.91.20130323/gdb/exceptions.h	2013-03-23 19:49:05.738459185 +0100
2c2fa1
@@ -90,6 +90,9 @@ enum errors {
2c2fa1
      aborted as the inferior state is no longer valid.  */
2c2fa1
   TARGET_CLOSE_ERROR,
2c2fa1
 
2c2fa1
+  /* Attempt to load a core file as executable.  */
2c2fa1
+  IS_CORE_ERROR,
2c2fa1
+
2c2fa1
   /* Add more errors here.  */
2c2fa1
   NR_ERRORS
2c2fa1
 };
2c2fa1
Index: gdb-7.5.91.20130323/gdb/exec.c
2c2fa1
===================================================================
2c2fa1
--- gdb-7.5.91.20130323.orig/gdb/exec.c	2013-01-31 19:37:37.000000000 +0100
2c2fa1
+++ gdb-7.5.91.20130323/gdb/exec.c	2013-03-23 19:48:53.284575912 +0100
2c2fa1
@@ -34,6 +34,7 @@
2c2fa1
 #include "gdbthread.h"
2c2fa1
 #include "progspace.h"
2c2fa1
 #include "gdb_bfd.h"
2c2fa1
+#include "exceptions.h"
2c2fa1
 
2c2fa1
 #include <fcntl.h>
2c2fa1
 #include "readline/readline.h"
2c2fa1
@@ -240,12 +241,27 @@ exec_file_attach (char *filename, int fr
2c2fa1
 
2c2fa1
       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
2c2fa1
 	{
2c2fa1
+	  int is_core;
2c2fa1
+
2c2fa1
+	  /* If the user accidentally did "gdb core", print a useful
2c2fa1
+	     error message.  Check it only after bfd_object has been checked as
2c2fa1
+	     a valid executable may get recognized for example also as
2c2fa1
+	     "trad-core".  */
2c2fa1
+	  is_core = bfd_check_format (exec_bfd, bfd_core);
2c2fa1
+
2c2fa1
 	  /* Make sure to close exec_bfd, or else "run" might try to use
2c2fa1
 	     it.  */
2c2fa1
 	  exec_close ();
2c2fa1
-	  error (_("\"%s\": not in executable format: %s"),
2c2fa1
-		 scratch_pathname,
2c2fa1
-		 gdb_bfd_errmsg (bfd_get_error (), matching));
2c2fa1
+
2c2fa1
+	  if (is_core != 0)
2c2fa1
+	    throw_error (IS_CORE_ERROR,
2c2fa1
+		   _("\"%s\" is a core file.\n"
2c2fa1
+		     "Please specify an executable to debug."),
2c2fa1
+		   scratch_pathname);
2c2fa1
+	  else
2c2fa1
+	    error (_("\"%s\": not in executable format: %s"),
2c2fa1
+		   scratch_pathname,
2c2fa1
+		   gdb_bfd_errmsg (bfd_get_error (), matching));
2c2fa1
 	}
2c2fa1
 
2c2fa1
       /* FIXME - This should only be run for RS6000, but the ifdef is a poor
2c2fa1
Index: gdb-7.5.91.20130323/gdb/main.c
2c2fa1
===================================================================
2c2fa1
--- gdb-7.5.91.20130323.orig/gdb/main.c	2013-03-23 19:48:18.000000000 +0100
2c2fa1
+++ gdb-7.5.91.20130323/gdb/main.c	2013-03-23 19:48:53.285575901 +0100
2c2fa1
@@ -296,6 +296,36 @@ typedef struct cmdarg {
2c2fa1
 /* Define type VEC (cmdarg_s).  */
2c2fa1
 DEF_VEC_O (cmdarg_s);
2c2fa1
 
2c2fa1
+/* Call exec_file_attach.  If it detected FILENAME is a core file call
2c2fa1
+   core_file_command.  Print the original exec_file_attach error only if
2c2fa1
+   core_file_command failed to find a matching executable.  */
2c2fa1
+
2c2fa1
+static void
2c2fa1
+exec_or_core_file_attach (char *filename, int from_tty)
2c2fa1
+{
2c2fa1
+  volatile struct gdb_exception e;
2c2fa1
+
2c2fa1
+  gdb_assert (exec_bfd == NULL);
2c2fa1
+
2c2fa1
+  TRY_CATCH (e, RETURN_MASK_ALL)
2c2fa1
+    {
2c2fa1
+      exec_file_attach (filename, from_tty);
2c2fa1
+    }
2c2fa1
+  if (e.reason < 0)
2c2fa1
+    {
2c2fa1
+      if (e.error == IS_CORE_ERROR)
2c2fa1
+	{
2c2fa1
+	  core_file_command (filename, from_tty);
2c2fa1
+
2c2fa1
+	  /* Iff the core file found its executable suppress the error message
2c2fa1
+	     from exec_file_attach.  */
2c2fa1
+	  if (exec_bfd != NULL)
2c2fa1
+	    return;
2c2fa1
+	}
2c2fa1
+      throw_exception (e);
2c2fa1
+    }
2c2fa1
+}
2c2fa1
+
2c2fa1
 static int
2c2fa1
 captured_main (void *data)
2c2fa1
 {
2c2fa1
@@ -796,6 +826,8 @@ captured_main (void *data)
2c2fa1
 	{
2c2fa1
 	  symarg = argv[optind];
2c2fa1
 	  execarg = argv[optind];
2c2fa1
+	  if (optind + 1 == argc && corearg == NULL)
2c2fa1
+	    corearg = argv[optind];
2c2fa1
 	  optind++;
2c2fa1
 	}
2c2fa1
 
2c2fa1
@@ -951,11 +983,25 @@ captured_main (void *data)
2c2fa1
       && symarg != NULL
2c2fa1
       && strcmp (execarg, symarg) == 0)
2c2fa1
     {
2c2fa1
+      catch_command_errors_ftype *func;
2c2fa1
+
2c2fa1
+      /* Call exec_or_core_file_attach only if the file was specified as
2c2fa1
+	 a command line argument (and not an a command line option).  */
2c2fa1
+      if (corearg != NULL && strcmp (corearg, execarg) == 0)
2c2fa1
+	{
2c2fa1
+	  func = exec_or_core_file_attach;
2c2fa1
+	  corearg = NULL;
2c2fa1
+	}
2c2fa1
+      else
2c2fa1
+	func = exec_file_attach;
2c2fa1
+
2c2fa1
       /* The exec file and the symbol-file are the same.  If we can't
2c2fa1
          open it, better only print one error message.
2c2fa1
-         catch_command_errors returns non-zero on success!  */
2c2fa1
-      if (catch_command_errors (exec_file_attach, execarg,
2c2fa1
-				!batch_flag, RETURN_MASK_ALL))
2c2fa1
+         catch_command_errors returns non-zero on success!
2c2fa1
+	 Do not load EXECARG as a symbol file if it has been already processed
2c2fa1
+	 as a core file.  */
2c2fa1
+      if (catch_command_errors (func, execarg, !batch_flag, RETURN_MASK_ALL)
2c2fa1
+	  && core_bfd == NULL)
2c2fa1
 	catch_command_errors (symbol_file_add_main, symarg,
2c2fa1
 			      !batch_flag, RETURN_MASK_ALL);
2c2fa1
     }