From patchwork Fri Jan 20 18:15:14 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulrich Weigand X-Patchwork-Id: 6328 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 80C2923F8D for ; Fri, 20 Jan 2012 18:15:21 +0000 (UTC) Received: from mail-bk0-f52.google.com (mail-bk0-f52.google.com [209.85.214.52]) by fiordland.canonical.com (Postfix) with ESMTP id 6A886A18209 for ; Fri, 20 Jan 2012 18:15:21 +0000 (UTC) Received: by bkar19 with SMTP id r19so769067bka.11 for ; Fri, 20 Jan 2012 10:15:21 -0800 (PST) Received: by 10.204.152.20 with SMTP id e20mr12017944bkw.117.1327083320944; Fri, 20 Jan 2012 10:15:20 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.205.82.144 with SMTP id ac16cs13115bkc; Fri, 20 Jan 2012 10:15:20 -0800 (PST) Received: by 10.213.27.200 with SMTP id j8mr4825412ebc.20.1327083319443; Fri, 20 Jan 2012 10:15:19 -0800 (PST) Received: from e06smtp17.uk.ibm.com (e06smtp17.uk.ibm.com. [195.75.94.113]) by mx.google.com with ESMTPS id t7si2181088eef.18.2012.01.20.10.15.19 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 20 Jan 2012 10:15:19 -0800 (PST) Received-SPF: pass (google.com: domain of uweigand@de.ibm.com designates 195.75.94.113 as permitted sender) client-ip=195.75.94.113; Authentication-Results: mx.google.com; spf=pass (google.com: domain of uweigand@de.ibm.com designates 195.75.94.113 as permitted sender) smtp.mail=uweigand@de.ibm.com Received: from /spool/local by e06smtp17.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 20 Jan 2012 18:15:19 -0000 Received: from d06nrmr1307.portsmouth.uk.ibm.com (9.149.38.129) by e06smtp17.uk.ibm.com (192.168.101.147) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 20 Jan 2012 18:15:16 -0000 Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by d06nrmr1307.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q0KIFFiQ2478212 for ; Fri, 20 Jan 2012 18:15:15 GMT Received: from d06av02.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q0KIFFvY000818 for ; Fri, 20 Jan 2012 11:15:15 -0700 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id q0KIFE6d000792 for ; Fri, 20 Jan 2012 11:15:14 -0700 Message-Id: <201201201815.q0KIFE6d000792@d06av02.portsmouth.uk.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Fri, 20 Jan 2012 19:15:14 +0100 Subject: [rfc v4][5/6] Make "info proc" command generic To: patches@linaro.org Date: Fri, 20 Jan 2012 19:15:14 +0100 (CET) From: "Ulrich Weigand" X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 x-cbid: 12012018-0542-0000-0000-000000C563C7 http://sourceware.org/ml/gdb-patches/2012-01/msg00690.html ChangeLog: * defs.h (enum info_proc_what): Moved here from linux-nat.c * infcmd.c: (info_proc_cmd_1): New function. (info_proc_cmd): New function, moved here from equivalent routine orignally in linux-nat.c. (info_proc_cmd_mappings): Likewise. (info_proc_cmd_stat): Likewise. (info_proc_cmd_status): Likewise. (info_proc_cmd_cwd): Likewise. (info_proc_cmd_cmdline): Likewise. (info_proc_cmd_exe): Likewise. (info_proc_cmd_all): Likewise. (_initialize_infcmd): Install "info proc" command and subcommands. * target.h (struct target_ops): Add to_info_proc. (target_info_proc): Add prototype. * target.c (target_info_proc): New function. * procfs.c (procfs_info_proc): Add prototype. (info_proc_cmd): Rename into ... (procfs_info_proc): ... this. Update argument types as appropriate for a to_info_proc implementation. Handle "what" argument. (procfs_target): Install procfs_info_proc. (_initialize_procfs): No longer install "info proc" command. * linux-nat.c: (enum info_proc_what): Remove. (linux_nat_info_proc_cmd_1): Rename into ... (linux_nat_info_proc): ... this. Update argument types as appropriate for a to_info_proc implementation. (linux_nat_info_proc_cmd): Remove. (linux_nat_info_proc_cmd_mappings): Likewise. (linux_nat_info_proc_cmd_stat): Likewise. (linux_nat_info_proc_cmd_status): Likewise. (linux_nat_info_proc_cmd_cwd): Likewise. (linux_nat_info_proc_cmd_cmdline): Likewise. (linux_nat_info_proc_cmd_exe): Likewise. (linux_nat_info_proc_cmd_all): Likewise. (linux_target_install_ops): Install linux_nat_info_proc. (_initialize_linux_nat): No longer install "info proc" command and subcommands. testsuite/ChangeLog: * gdb.base/info-proc.exp: Also run on remote targets. Main "info proc" command is now always present; whether target supports actual info proc operation is detected when attempting to issue the command. Index: gdb-head/gdb/target.h =================================================================== --- gdb-head.orig/gdb/target.h 2012-01-19 10:40:27.000000000 +0100 +++ gdb-head/gdb/target.h 2012-01-19 10:40:57.000000000 +0100 @@ -715,6 +715,9 @@ struct target_ops char *(*to_fileio_readlink) (const char *filename, int *target_errno); + /* Implement the "info proc" command. */ + void (*to_info_proc) (struct target_ops *, char *, enum info_proc_what); + /* Tracepoint-related operations. */ /* Prepare the target for a tracing run. */ @@ -942,6 +945,10 @@ extern void target_store_registers (stru struct address_space *target_thread_address_space (ptid_t); +/* Implement the "info proc" command. */ + +void target_info_proc (char *, enum info_proc_what); + /* Returns true if this target can debug multiple processes simultaneously. */ Index: gdb-head/gdb/procfs.c =================================================================== --- gdb-head.orig/gdb/procfs.c 2012-01-19 10:35:57.000000000 +0100 +++ gdb-head/gdb/procfs.c 2012-01-19 10:40:57.000000000 +0100 @@ -151,6 +151,9 @@ static char * procfs_make_note_section ( static int procfs_can_use_hw_breakpoint (int, int, int); +static void procfs_info_proc (struct target_ops *, char *, + enum info_proc_what); + #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) /* When GDB is built as 64-bit application on Solaris, the auxv data is presented in 64-bit format. We need to provide a custom parser @@ -211,6 +214,7 @@ procfs_target (void) t->to_has_thread_control = tc_schedlock; t->to_find_memory_regions = proc_find_memory_regions; t->to_make_corefile_notes = procfs_make_note_section; + t->to_info_proc = procfs_info_proc; #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) t->to_auxv_parse = procfs_auxv_parse; @@ -5390,7 +5394,8 @@ info_proc_mappings (procinfo *pi, int su /* Implement the "info proc" command. */ static void -info_proc_cmd (char *args, int from_tty) +procfs_info_proc (struct target_ops *ops, char *args, + enum info_proc_what what) { struct cleanup *old_chain; procinfo *process = NULL; @@ -5401,6 +5406,20 @@ info_proc_cmd (char *args, int from_tty) int tid = 0; int mappings = 0; + switch (what) + { + case IP_MINIMAL: + break; + + case IP_MAPPINGS: + case IP_ALL: + mappings = 1; + break; + + default: + error (_("Not supported on this target.")); + } + old_chain = make_cleanup (null_cleanup, 0); if (args) { @@ -5419,14 +5438,6 @@ info_proc_cmd (char *args, int from_tty) { tid = strtoul (argv[0] + 1, NULL, 10); } - else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0) - { - mappings = 1; - } - else - { - /* [...] */ - } argv++; } if (pid == 0) @@ -5567,10 +5578,6 @@ _initialize_procfs (void) { observer_attach_inferior_created (procfs_inferior_created); - add_info ("proc", info_proc_cmd, _("\ -Show /proc process information about any running process.\n\ -Specify process id, or use the program being debugged by default.\n\ -Specify keyword 'mappings' for detailed info on memory mappings.")); add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd, _("Give a trace of entries into the syscall.")); add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd, Index: gdb-head/gdb/target.c =================================================================== --- gdb-head.orig/gdb/target.c 2012-01-19 10:40:27.000000000 +0100 +++ gdb-head/gdb/target.c 2012-01-19 10:40:57.000000000 +0100 @@ -3088,6 +3088,38 @@ target_supports_non_stop (void) return 0; } +/* Implement the "info proc" command. */ + +void +target_info_proc (char *args, enum info_proc_what what) +{ + struct target_ops *t; + + /* If we're already connected to something that can get us OS + related data, use it. Otherwise, try using the native + target. */ + if (current_target.to_stratum >= process_stratum) + t = current_target.beneath; + else + t = find_default_run_target (NULL); + + for (; t != NULL; t = t->beneath) + { + if (t->to_info_proc != NULL) + { + t->to_info_proc (t, args, what); + + if (targetdebug) + fprintf_unfiltered (gdb_stdlog, + "target_info_proc (\"%s\", %d)\n", args, what); + + return; + } + } + + error (_("Not supported on this target.")); +} + static int find_default_supports_disable_randomization (void) { Index: gdb-head/gdb/linux-nat.c =================================================================== --- gdb-head.orig/gdb/linux-nat.c 2012-01-19 10:35:57.000000000 +0100 +++ gdb-head/gdb/linux-nat.c 2012-01-19 10:40:57.000000000 +0100 @@ -4803,35 +4803,9 @@ linux_nat_make_corefile_notes (bfd *obfd /* Implement the "info proc" command. */ -enum info_proc_what - { - /* Display the default cmdline, cwd and exe outputs. */ - IP_MINIMAL, - - /* Display `info proc mappings'. */ - IP_MAPPINGS, - - /* Display `info proc status'. */ - IP_STATUS, - - /* Display `info proc stat'. */ - IP_STAT, - - /* Display `info proc cmdline'. */ - IP_CMDLINE, - - /* Display `info proc exe'. */ - IP_EXE, - - /* Display `info proc cwd'. */ - IP_CWD, - - /* Display all of the above. */ - IP_ALL - }; - static void -linux_nat_info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty) +linux_nat_info_proc (struct target_ops *ops, char *args, + enum info_proc_what what) { /* A long is used for pid instead of an int to avoid a loss of precision compiler warning from the output of strtoul. */ @@ -5072,70 +5046,6 @@ linux_nat_info_proc_cmd_1 (char *args, e } } -/* Implement `info proc' when given without any futher parameters. */ - -static void -linux_nat_info_proc_cmd (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_MINIMAL, from_tty); -} - -/* Implement `info proc mappings'. */ - -static void -linux_nat_info_proc_cmd_mappings (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_MAPPINGS, from_tty); -} - -/* Implement `info proc stat'. */ - -static void -linux_nat_info_proc_cmd_stat (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_STAT, from_tty); -} - -/* Implement `info proc status'. */ - -static void -linux_nat_info_proc_cmd_status (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_STATUS, from_tty); -} - -/* Implement `info proc cwd'. */ - -static void -linux_nat_info_proc_cmd_cwd (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_CWD, from_tty); -} - -/* Implement `info proc cmdline'. */ - -static void -linux_nat_info_proc_cmd_cmdline (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_CMDLINE, from_tty); -} - -/* Implement `info proc exe'. */ - -static void -linux_nat_info_proc_cmd_exe (char *args, int from_tty) -{ - linux_nat_info_proc_cmd_1 (args, IP_EXE, from_tty); -} - -/* Implement `info proc all'. */ - -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, @@ -5430,6 +5340,7 @@ linux_target_install_ops (struct target_ t->to_follow_fork = linux_child_follow_fork; t->to_find_memory_regions = linux_nat_find_memory_regions; t->to_make_corefile_notes = linux_nat_make_corefile_notes; + t->to_info_proc = linux_nat_info_proc; super_xfer_partial = t->to_xfer_partial; t->to_xfer_partial = linux_xfer_partial; @@ -5940,43 +5851,6 @@ extern initialize_file_ftype _initialize void _initialize_linux_nat (void) { - static struct cmd_list_element *info_proc_cmdlist; - - 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."), - &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 process info from /proc/PID/stat."), - &info_proc_cmdlist); - - add_cmd ("status", class_info, linux_nat_info_proc_cmd_status, _("\ -List process info from /proc/PID/status."), - &info_proc_cmdlist); - - add_cmd ("cwd", class_info, linux_nat_info_proc_cmd_cwd, _("\ -List current working directory of the process."), - &info_proc_cmdlist); - - add_cmd ("cmdline", class_info, linux_nat_info_proc_cmd_cmdline, _("\ -List command line arguments of the process."), - &info_proc_cmdlist); - - add_cmd ("exe", class_info, linux_nat_info_proc_cmd_exe, _("\ -List absolute filename for executable of the process."), - &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, _("\ Set debugging of GNU/Linux lwp module."), _("\ Index: gdb-head/gdb/infcmd.c =================================================================== --- gdb-head.orig/gdb/infcmd.c 2012-01-19 10:35:57.000000000 +0100 +++ gdb-head/gdb/infcmd.c 2012-01-19 10:40:57.000000000 +0100 @@ -2805,9 +2805,82 @@ unset_command (char *args, int from_tty) help_list (unsetlist, "unset ", -1, gdb_stdout); } +/* Implement `info proc' family of commands. */ + +static void +info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty) +{ + target_info_proc (args, what); +} + +/* Implement `info proc' when given without any futher parameters. */ + +static void +info_proc_cmd (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_MINIMAL, from_tty); +} + +/* Implement `info proc mappings'. */ + +static void +info_proc_cmd_mappings (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_MAPPINGS, from_tty); +} + +/* Implement `info proc stat'. */ + +static void +info_proc_cmd_stat (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_STAT, from_tty); +} + +/* Implement `info proc status'. */ + +static void +info_proc_cmd_status (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_STATUS, from_tty); +} + +/* Implement `info proc cwd'. */ + +static void +info_proc_cmd_cwd (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_CWD, from_tty); +} + +/* Implement `info proc cmdline'. */ + +static void +info_proc_cmd_cmdline (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_CMDLINE, from_tty); +} + +/* Implement `info proc exe'. */ + +static void +info_proc_cmd_exe (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_EXE, from_tty); +} + +/* Implement `info proc all'. */ + +static void +info_proc_cmd_all (char *args, int from_tty) +{ + info_proc_cmd_1 (args, IP_ALL, from_tty); +} + void _initialize_infcmd (void) { + static struct cmd_list_element *info_proc_cmdlist; struct cmd_list_element *c = NULL; /* Add the filename of the terminal connected to inferior I/O. */ @@ -3034,4 +3107,39 @@ Register name as argument means describe add_info ("vector", vector_info, _("Print the status of the vector unit\n")); + + add_prefix_cmd ("proc", class_info, info_proc_cmd, + _("\ +Show /proc process information about any running process.\n\ +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, info_proc_cmd_mappings, _("\ +List of mapped memory regions."), + &info_proc_cmdlist); + + add_cmd ("stat", class_info, info_proc_cmd_stat, _("\ +List process info from /proc/PID/stat."), + &info_proc_cmdlist); + + add_cmd ("status", class_info, info_proc_cmd_status, _("\ +List process info from /proc/PID/status."), + &info_proc_cmdlist); + + add_cmd ("cwd", class_info, info_proc_cmd_cwd, _("\ +List current working directory of the process."), + &info_proc_cmdlist); + + add_cmd ("cmdline", class_info, info_proc_cmd_cmdline, _("\ +List command line arguments of the process."), + &info_proc_cmdlist); + + add_cmd ("exe", class_info, info_proc_cmd_exe, _("\ +List absolute filename for executable of the process."), + &info_proc_cmdlist); + + add_cmd ("all", class_info, info_proc_cmd_all, _("\ +List all available /proc info."), + &info_proc_cmdlist); } Index: gdb-head/gdb/defs.h =================================================================== --- gdb-head.orig/gdb/defs.h 2012-01-19 10:35:57.000000000 +0100 +++ gdb-head/gdb/defs.h 2012-01-19 10:40:57.000000000 +0100 @@ -752,6 +752,35 @@ extern struct command_line *read_command extern void free_command_lines (struct command_line **); +/* Parameters of the "info proc" command. */ + +enum info_proc_what + { + /* Display the default cmdline, cwd and exe outputs. */ + IP_MINIMAL, + + /* Display `info proc mappings'. */ + IP_MAPPINGS, + + /* Display `info proc status'. */ + IP_STATUS, + + /* Display `info proc stat'. */ + IP_STAT, + + /* Display `info proc cmdline'. */ + IP_CMDLINE, + + /* Display `info proc exe'. */ + IP_EXE, + + /* Display `info proc cwd'. */ + IP_CWD, + + /* Display all of the above. */ + IP_ALL + }; + /* String containing the current directory (what getwd would return). */ extern char *current_directory; Index: gdb-head/gdb/testsuite/gdb.base/info-proc.exp =================================================================== --- gdb-head.orig/gdb/testsuite/gdb.base/info-proc.exp 2012-01-19 10:38:33.000000000 +0100 +++ gdb-head/gdb/testsuite/gdb.base/info-proc.exp 2012-01-19 10:40:57.000000000 +0100 @@ -16,11 +16,6 @@ # This file was written by Michael Snyder (msnyder@redhat.com) # This is a test for the gdb command "info proc" -if { [is_remote target] } then { - continue -} - - set ws "\[ \t\]+" set testfile "break" @@ -50,17 +45,7 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} -# Does this gdb support info proc? -gdb_test_multiple "help info proc" "help info proc" { - -re "Undefined info command: .proc.. Try .help info.*$gdb_prompt $" { - # info proc command not supported -- nothing to test here. - unsupported "gdb does not support info proc on this target" - return -1; - } - -re "Show /proc process information about .*$gdb_prompt $" { - pass "help info proc" - } -} +gdb_test "help info proc" "Show /proc process information about .*" gdb_test "info proc" "No current process.*" "info proc without a process" @@ -69,7 +54,17 @@ if { ! [ runto_main ] } then { return -1 } -gdb_test "info proc" "process ${decimal}.*" "info proc with process" +# Does this gdb support info proc? +gdb_test_multiple "info proc" "info proc" { + -re "Not supported on this target.*$gdb_prompt $" { + # info proc command not supported -- nothing to test here. + unsupported "gdb does not support info proc on this target" + return -1; + } + -re "process ${decimal}.*$gdb_prompt $" { + pass "info proc with process" + } +} gdb_test "info proc mapping" \ ".*Mapped address spaces:.*${hex}${ws}${hex}${ws}${hex}${ws}${hex}.*" \