aboutsummaryrefslogtreecommitdiff
path: root/gdb/main.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2008-01-05 16:49:53 +0000
committerPedro Alves <palves@redhat.com>2008-01-05 16:49:53 +0000
commita4d9b460bdb43dd457b972723d7823193d697249 (patch)
treecc0a44d228497af37293867e99b4badf42bbb00b /gdb/main.c
parentf9c112822a7f4616f26ade0a947135c9ba319f9e (diff)
downloadfsf-binutils-gdb-a4d9b460bdb43dd457b972723d7823193d697249.zip
fsf-binutils-gdb-a4d9b460bdb43dd457b972723d7823193d697249.tar.gz
fsf-binutils-gdb-a4d9b460bdb43dd457b972723d7823193d697249.tar.bz2
gdb/
* main.c (captured_main): Remove 'count' varible and the ALIGN_STACK_ON_ENTRY block that used it. Error out if --core and --pid options were issued simultaneously. If an explicit pid option was passed, don't fallback to core file. Detect extra arguments better in the presence of explicit pid or core arguments. gdb/doc/ * gdbint.texinfo (Host Conditionals): Remove mention of ALIGN_STACK_ON_ENTRY.
Diffstat (limited to 'gdb/main.c')
-rw-r--r--gdb/main.c86
1 files changed, 49 insertions, 37 deletions
diff --git a/gdb/main.c b/gdb/main.c
index b7a151e..eb7ad5a 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -119,7 +119,6 @@ captured_main (void *data)
struct captured_main_args *context = data;
int argc = context->argc;
char **argv = context->argv;
- int count;
static int quiet = 0;
static int batch = 0;
static int set_args = 0;
@@ -127,7 +126,9 @@ captured_main (void *data)
/* Pointers to various arguments from command line. */
char *symarg = NULL;
char *execarg = NULL;
+ char *pidarg = NULL;
char *corearg = NULL;
+ char *pid_or_core_arg = NULL;
char *cdarg = NULL;
char *ttyarg = NULL;
@@ -175,12 +176,6 @@ captured_main (void *data)
lim_at_start = (char *) sbrk (0);
#endif
-#if defined (ALIGN_STACK_ON_STARTUP)
- i = (int) &count & 0x3;
- if (i != 0)
- alloca (4 - i);
-#endif
-
cmdsize = 1;
cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg));
ncmd = 0;
@@ -435,8 +430,7 @@ captured_main (void *data)
corearg = optarg;
break;
case 'p':
- /* "corearg" is shared by "--core" and "--pid" */
- corearg = optarg;
+ pidarg = optarg;
break;
case 'x':
cmdarg[ncmd].type = CMDARG_FILE;
@@ -572,26 +566,34 @@ extern int gdbtk_test (char *);
}
else
{
- /* OK, that's all the options. The other arguments are filenames. */
- count = 0;
- for (; optind < argc; optind++)
- switch (++count)
- {
- case 1:
- symarg = argv[optind];
- execarg = argv[optind];
- break;
- case 2:
- /* The documentation says this can be a "ProcID" as well.
- We will try it as both a corefile and a pid. */
- corearg = argv[optind];
- break;
- case 3:
- fprintf_unfiltered (gdb_stderr,
- _("Excess command line arguments ignored. (%s%s)\n"),
- argv[optind], (optind == argc - 1) ? "" : " ...");
- break;
- }
+ /* OK, that's all the options. */
+
+ /* The first argument, if specified, is the name of the
+ executable. */
+ if (optind < argc)
+ {
+ symarg = argv[optind];
+ execarg = argv[optind];
+ optind++;
+ }
+
+ /* If the user hasn't already specified a PID or the name of a
+ core file, then a second optional argument is allowed. If
+ present, this argument should be interpreted as either a
+ PID or a core file, whichever works. */
+ if (pidarg == NULL && corearg == NULL && optind < argc)
+ {
+ pid_or_core_arg = argv[optind];
+ optind++;
+ }
+
+ /* Any argument left on the command line is unexpected and
+ will be ignored. Inform the user. */
+ if (optind < argc)
+ fprintf_unfiltered (gdb_stderr, _("\
+Excess command line arguments ignored. (%s%s)\n"),
+ argv[optind],
+ (optind == argc - 1) ? "" : " ...");
}
if (batch)
quiet = 1;
@@ -733,21 +735,31 @@ extern int gdbtk_test (char *);
catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
}
+ if (corearg && pidarg)
+ error (_("\
+Can't attach to process and specify a core file at the same time."));
+
if (corearg != NULL)
+ catch_command_errors (core_file_command, corearg,
+ !batch, RETURN_MASK_ALL);
+ else if (pidarg != NULL)
+ catch_command_errors (attach_command, pidarg,
+ !batch, RETURN_MASK_ALL);
+ else if (pid_or_core_arg)
{
- /* corearg may be either a corefile or a pid.
- If its first character is a digit, try attach first
- and then corefile. Otherwise try corefile first. */
+ /* The user specified 'gdb program pid' or gdb program core'.
+ If pid_or_core_arg's first character is a digit, try attach
+ first and then corefile. Otherwise try just corefile. */
- if (isdigit (corearg[0]))
+ if (isdigit (pid_or_core_arg[0]))
{
- if (catch_command_errors (attach_command, corearg,
+ if (catch_command_errors (attach_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL) == 0)
- catch_command_errors (core_file_command, corearg,
+ catch_command_errors (core_file_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL);
}
- else /* Can't be a pid, better be a corefile. */
- catch_command_errors (core_file_command, corearg,
+ else /* Can't be a pid, better be a corefile. */
+ catch_command_errors (core_file_command, pid_or_core_arg,
!batch, RETURN_MASK_ALL);
}