2010-04-14 Pedro Alves 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, _("\