Re: [RFA] Add new cmd line parameter "--pid" for attach.

Elena Zannoni
2002-01-08T02:55:24Z

Michael Snyder writes:
>
> Currently if you invoke gdb as:
>
> gdb filename 12345
>
> gdb will attempt to open a corefile called "12345", and if that
> fails it will print a "file not found" warning, and then attempt
> to attach to a process "12345".
>
> There is a "--core <filename>" command-line argument,
> so that you can specify a corefile without a symbol file:
>
> gdb --core <filename>
>
> but there is no "--pid" option to allow you to specify
> a process-id without a symbol file.
>
> This patch does two things:
>
> 1) Add a "--pid" option to allow specification of an attach pid.
>

This bit is approved.

> 2) If the second argument (after the symbol-file) begins with
> a digit, try attach first instead of trying to open it as a
> corefile first. This eliminates the "file not found" warning.
>

About this, I have a question, what happens if you have a corefile
whose name starts with a digit? I tried it and I get an error:

[ezannoni@localhost gdb]$ ./gdb -nw ./gdb 2222core
GNU gdb 2002-01-03-cvs
Copyright 2001 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Attaching to program: /home/ezannoni/sources/native/gdb/gdb, process 2222
ptrace: No such process.

then it proceeds normally to figure out it's a core file.

I can be convinced that a digit is more likely to indicate a pid than
a corefile, but would there be a way to make that error be silent? I
realize that those error messages are generated in the bowels of gdb,
and it may be really hard to fix that (gee, isn't this something the
insight people have some opinion about? :-)

What's that bit about input-radix and output-radix?

Elena

> 2002-01-04 Michael Snyder <msnyder@redhat.com>
>
> * main.c (captured_main): Add new command line option "--pid".
> If the second command line argument (following the symbol-file)
> begins with a digit, try to attach to it before trying to open
> it as a corefile.
> (print_gdb_help): Document the "--pid" argument.
>
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/main.c,v
> retrieving revision 1.14
> diff -c -3 -p -r1.14 main.c
> *** main.c 2001/11/22 00:23:12 1.14
> --- main.c 2002/01/05 03:15:43
> *************** captured_main (void *data)
> *** 239,244 ****
> --- 239,246 ----
> {"e", required_argument, 0, 'e'},
> {"core", required_argument, 0, 'c'},
> {"c", required_argument, 0, 'c'},
> + {"pid", required_argument, 0, 'p'},
> + {"p", required_argument, 0, 'p'},
> {"command", required_argument, 0, 'x'},
> {"version", no_argument, &print_version, 1},
> {"x", required_argument, 0, 'x'},
> *************** captured_main (void *data)
> *** 320,325 ****
> --- 322,331 ----
> case 'c':
> corearg = optarg;
> break;
> + case 'p':
> + /* "corearg" is shared by "--core" and "--pid" */
> + corearg = optarg;
> + break;
> case 'x':
> cmdarg[ncmd++] = optarg;
> if (ncmd >= cmdsize)
> *************** extern int gdbtk_test (char *);
> *** 463,470 ****
> execarg = argv[optind];
> break;
> case 2:
> ! /* FIXME: The documentation says this can be a
> ! "ProcID". as well. */
> corearg = argv[optind];
> break;
> case 3:
> --- 469,476 ----
> 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:
> *************** extern int gdbtk_test (char *);
> *** 586,597 ****
>
> if (corearg != NULL)
> {
> ! if (catch_command_errors (core_file_command, corearg, !batch, RETURN_MASK_ALL) == 0)
> {
> ! /* See if the core file is really a PID. */
> ! if (isdigit (corearg[0]))
> ! catch_command_errors (attach_command, corearg, !batch, RETURN_MASK_ALL);
> }
> }
>
> if (ttyarg != NULL)
> --- 592,611 ----
>
> if (corearg != NULL)
> {
> ! /* 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. */
> !
> ! if (isdigit (corearg[0]))
> {
> ! if (catch_command_errors (attach_command, corearg,
> ! !batch, RETURN_MASK_ALL) == 0)
> ! catch_command_errors (core_file_command, corearg,
> ! !batch, RETURN_MASK_ALL);
> }
> + else /* Can't be a pid, better be a corefile. */
> + catch_command_errors (core_file_command, corearg,
> + !batch, RETURN_MASK_ALL);
> }
>
> if (ttyarg != NULL)
> *************** extern int gdbtk_test (char *);
> *** 616,621 ****
> --- 630,646 ----
> catch_command_errors (source_command, gdbinit, 0, RETURN_MASK_ALL);
> }
>
> + /* These need to be set this late in the initialization to ensure that
> + they are defined for the current environment. They define the
> + radix variables needed by a save-breakpoints file to preserve the
> + radix across the breakpoints restoration assuming they are restored
> + using the -x (-command) command line options. */
> +
> + set_internalvar (lookup_internalvar ("input_radix"),
> + value_from_longest (builtin_type_int, (LONGEST) input_radix));
> + set_internalvar (lookup_internalvar ("output_radix"),
> + value_from_longest (builtin_type_int, (LONGEST) output_radix));
> +
> for (i = 0; i < ncmd; i++)
> {
> #if 0
> *************** Options:\n\n\
> *** 752,757 ****
> --- 777,783 ----
> --cd=DIR Change current directory to DIR.\n\
> --command=FILE Execute GDB commands from FILE.\n\
> --core=COREFILE Analyze the core dump COREFILE.\n\
> + --pid=PID Attach to running process PID.\n\
> ", stream);
> fputs_unfiltered ("\
> --dbx DBX compatibility mode.\n\