Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: Doug Evans <dje@google.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [patch] print a more useful error message for "gdb core"
Date: Mon, 25 Jan 2010 04:22:00 -0000	[thread overview]
Message-ID: <20100125042214.GA14471@host0.dyn.jankratochvil.net> (raw)
In-Reply-To: <e394668d1001210917k569a6857i789090f1dfa81165@mail.gmail.com>

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  <jan.kratochvil@redhat.com>

	* exceptions.h (enum errors <IS_CORE_ERROR>): New.
	* exec.c: Include exceptions.h.
	(exec_file_attach <bfd_core>): Call throw_error (IS_CORE_ERROR, ...).
	* main.c (exec_or_core_file_attach): New.
	(captured_main <optind < argc>): Set also corearg.
	(captured_main <strcmp (execarg, symarg) == 0>): 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  <dje@google.com>

	* 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 <fcntl.h>
 #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,7 @@ extern int gdbtk_test (char *);
 	{
 	  symarg = argv[optind];
 	  execarg = argv[optind];
+	  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


  reply	other threads:[~2010-01-25  4:22 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-20 23:56 Doug Evans
2010-01-21  0:13 ` Doug Evans
2010-01-21  2:33   ` Hui Zhu
2010-01-21 13:58   ` Jan Kratochvil
2010-01-21 16:34     ` Tom Tromey
2010-01-21 17:17     ` Doug Evans
2010-01-25  4:22       ` Jan Kratochvil [this message]
2010-01-28 21:37 ` Jan Kratochvil
2010-01-28 21:39   ` Doug Evans

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100125042214.GA14471@host0.dyn.jankratochvil.net \
    --to=jan.kratochvil@redhat.com \
    --cc=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox