From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19595 invoked by alias); 31 Oct 2011 12:21:16 -0000 Received: (qmail 19585 invoked by uid 22791); 31 Oct 2011 12:21:14 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,TW_RG,T_FRT_PROFILE2 X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 31 Oct 2011 12:21:00 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=EU1-MAIL.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1RKqrL-00053Z-Dg from pedro_alves@mentor.com ; Mon, 31 Oct 2011 05:20:59 -0700 Received: from scottsdale.localnet ([172.16.63.104]) by EU1-MAIL.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.1830); Mon, 31 Oct 2011 12:20:56 +0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: [PATCH] Implement new `info core mappings' command Date: Mon, 31 Oct 2011 12:57:00 -0000 User-Agent: KMail/1.13.6 (Linux/2.6.38-12-generic; KDE/4.7.1; x86_64; ; ) Cc: Jan Kratochvil , Sergio Durigan Junior References: <20111031070012.GA32610@host1.jankratochvil.net> In-Reply-To: <20111031070012.GA32610@host1.jankratochvil.net> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_lKprOpGRVT1FN0F" Message-Id: <201110311220.53564.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-10/txt/msg00820.txt.bz2 --Boundary-00=_lKprOpGRVT1FN0F Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-length: 843 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 --Boundary-00=_lKprOpGRVT1FN0F Content-Type: text/x-patch; charset="UTF-8"; name="proc_map.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="proc_map.diff" Content-length: 6614 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, _("\ --Boundary-00=_lKprOpGRVT1FN0F--