Re: [PATCH] Implement new `info core mappings' command

Pedro Alves
2011-10-31T12:21:16Z

[-- Attachment #1: Type: Text/Plain, Size: 843 bytes --]

On Monday 31 October 2011 07:00:12, Jan Kratochvil wrote:

> > > I think it should be add_prefix_cmd so that tab completion works. "mappings
> > > / "all" should be commands, not parameters. "info proc" already has this bug.
> >
> > Yeah, `info proc' is buggy indeed. I'll see if I send a patch fixing it
> > tomorrow. Thanks for the tip.
>
> Or it should be a single command using add_setshow_enum_cmd, not sure which
> approach is better. Still I think the separate commands are better as they
> can have each specific help text.

I once wrote a patch for that. /me *looks for it*
The reason I never pushed it is that "info proc" handles
more than one keyword at the same time. E.g.,
"info proc cmdline cwd" displays both cmdline and cwd
info simultaneously. That doesn't work if you have a
command per keyword.

--
Pedro Alves

[-- Attachment #2: proc_map.diff --]
[-- Type: text/x-patch, Size: 6614 bytes --]

2010-04-14 Pedro Alves <pedro@codesourcery.com>

gdb/
* linux-nat.c (info_proc_cmdlist): New.
(info_proc_command): New.
(_initialize_linux_nat): Install `info mappings', `info stat `,
info proc stat', `info proc status' and `info proc all' as real
subcommands of `info proc'.

---
gdb/linux-nat.c | 182 ++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 119 insertions(+), 63 deletions(-)

Index: src/gdb/linux-nat.c
===================================================================
--- src.orig/gdb/linux-nat.c 2010-04-14 17:49:17.000000000 +0100
+++ src/gdb/linux-nat.c 2010-04-14 19:18:55.000000000 +0100
@@ -4429,72 +4429,43 @@ linux_nat_make_corefile_notes (bfd *obfd

/* Implement the "info proc" command. */

+enum info_proc_what
+ {
+ IP_MINIMAL = 0,
+
+ IP_MAPPINGS = 1,
+ IP_STATUS,
+ IP_STAT,
+ IP_CMDLINE,
+ IP_EXE,
+ IP_ENVIRON,
+ IP_CWD,
+
+ IP_ALL = -1
+ };
+
static void
-linux_nat_info_proc_cmd (char *args, int from_tty)
+linux_nat_info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty)
{
/* A long is used for pid instead of an int to avoid a loss of precision
compiler warning from the output of strtoul. */
long pid = PIDGET (inferior_ptid);
FILE *procfile;
- char **argv = NULL;
char buffer[MAXPATHLEN];
char fname1[MAXPATHLEN], fname2[MAXPATHLEN];
- int cmdline_f = 1;
- int cwd_f = 1;
- int exe_f = 1;
- int mappings_f = 0;
- int environ_f = 0;
- int status_f = 0;
- int stat_f = 0;
- int all = 0;
+ int cmdline_f = (what == IP_MINIMAL || what == IP_CMDLINE);
+ int cwd_f = (what == IP_MINIMAL || what == IP_CWD);
+ int exe_f = (what == IP_MINIMAL || what == IP_EXE);
+ int mappings_f = (what == IP_MAPPINGS);
+ int environ_f = (what == IP_ENVIRON);
+ int status_f = (what == IP_STATUS);
+ int stat_f = (what == IP_STAT);
+ int all = (what == IP_ALL);
struct stat dummy;

- if (args)
- {
- /* Break up 'args' into an argv array. */
- argv = gdb_buildargv (args);
- make_cleanup_freeargv (argv);
- }
- while (argv != NULL && *argv != NULL)
- {
- if (isdigit (argv[0][0]))
- {
- pid = strtoul (argv[0], NULL, 10);
- }
- else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0)
- {
- mappings_f = 1;
- }
- else if (strcmp (argv[0], "status") == 0)
- {
- status_f = 1;
- }
- else if (strcmp (argv[0], "stat") == 0)
- {
- stat_f = 1;
- }
- else if (strcmp (argv[0], "cmd") == 0)
- {
- cmdline_f = 1;
- }
- else if (strncmp (argv[0], "exe", strlen (argv[0])) == 0)
- {
- exe_f = 1;
- }
- else if (strcmp (argv[0], "cwd") == 0)
- {
- cwd_f = 1;
- }
- else if (strncmp (argv[0], "all", strlen (argv[0])) == 0)
- {
- all = 1;
- }
- else
- {
- /* [...] (future options here) */
- }
- argv++;
- }
+ if (args && isdigit (args[0]))
+ pid = strtoul (args, NULL, 10);
+
if (pid == 0)
error (_("No current process: you must name one."));

@@ -4710,6 +4681,60 @@ linux_nat_info_proc_cmd (char *args, int
}
}

+static void
+linux_nat_info_proc_cmd (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_MINIMAL, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_mappings (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_MAPPINGS, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_stat (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_STAT, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_status (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_STATUS, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_cwd (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_CWD, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_cmdline (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_CMDLINE, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_exe (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_EXE, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_environ (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_ENVIRON, from_tty);
+}
+
+static void
+linux_nat_info_proc_cmd_all (char *args, int from_tty)
+{
+ linux_nat_info_proc_cmd_1 (args, IP_ALL, from_tty);
+}
+
/* Implement the to_xfer_partial interface for memory reads using the /proc
filesystem. Because we can use a single read() call for /proc, this
can be much more efficient than banging away at PTRACE_PEEKTEXT,
@@ -5624,16 +5649,47 @@ extern initialize_file_ftype _initialize
void
_initialize_linux_nat (void)
{
+ static struct cmd_list_element *info_proc_cmdlist;
sigset_t mask;

- add_info ("proc", linux_nat_info_proc_cmd, _("\
+ add_prefix_cmd ("proc", class_info, linux_nat_info_proc_cmd,
+ _("\
Show /proc process information about any running process.\n\
-Specify any process id, or use the program being debugged by default.\n\
-Specify any of the following keywords for detailed info:\n\
- mappings -- list of mapped memory regions.\n\
- stat -- list a bunch of random process info.\n\
- status -- list a different bunch of random process info.\n\
- all -- list all available /proc info."));
+Specify any process id, or use the program being debugged by default."),
+ &info_proc_cmdlist, "info proc ",
+ 1/*allow-unknown*/, &infolist);
+
+ add_cmd ("mappings", class_info, linux_nat_info_proc_cmd_mappings, _("\
+List of mapped memory regions."),
+ &info_proc_cmdlist);
+
+ add_cmd ("stat", class_info, linux_nat_info_proc_cmd_stat, _("\
+List a bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("status", class_info, linux_nat_info_proc_cmd_status, _("\
+List a different bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("cwd", class_info, linux_nat_info_proc_cmd_cwd, _("\
+List a different bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("cmdline", class_info, linux_nat_info_proc_cmd_cmdline, _("\
+List a different bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("exe", class_info, linux_nat_info_proc_cmd_exe, _("\
+List a different bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("environ", class_info, linux_nat_info_proc_cmd_environ, _("\
+List a different bunch of random process info."),
+ &info_proc_cmdlist);
+
+ add_cmd ("all", class_info, linux_nat_info_proc_cmd_all, _("\
+List all available /proc info."),
+ &info_proc_cmdlist);

add_setshow_zinteger_cmd ("lin-lwp", class_maintenance,
&debug_linux_nat, _("\