gdb/
* linux-nat.c: Include cli/cli-utils.h. (enum info_proc_what): New. (linux_nat_info_proc_cmd): Rename to ... (linux_nat_info_proc_cmd_1): ... here. Remove variables argv and all. New parameter what. Initialize cmdline_f, cwd_f, exe_f, mappings_f, status_f and stat_f from WHAT. Throw error on extra parameters. (linux_nat_info_proc_cmd, linux_nat_info_proc_cmd_mappings) (linux_nat_info_proc_cmd_stat, linux_nat_info_proc_cmd_status) (linux_nat_info_proc_cmd_cwd, linux_nat_info_proc_cmd_cmdline) (linux_nat_info_proc_cmd_exe, linux_nat_info_proc_cmd_all): New. (_initialize_linux_nat): New variable info_proc_cmdlist. Install `info proc mappings', `info proc stat`, `info proc status', `info proc cwd', `info proc cmdline', `info proc exe' and `info proc all' as real subcommands of `info proc'.
This commit is contained in:
parent
a72173de25
commit
f179e16214
2 changed files with 165 additions and 68 deletions
|
@ -1,3 +1,21 @@
|
||||||
|
2011-11-02 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* linux-nat.c: Include cli/cli-utils.h.
|
||||||
|
(enum info_proc_what): New.
|
||||||
|
(linux_nat_info_proc_cmd): Rename to ...
|
||||||
|
(linux_nat_info_proc_cmd_1): ... here. Remove variables argv and all.
|
||||||
|
New parameter what. Initialize cmdline_f, cwd_f, exe_f, mappings_f,
|
||||||
|
status_f and stat_f from WHAT. Throw error on extra parameters.
|
||||||
|
(linux_nat_info_proc_cmd, linux_nat_info_proc_cmd_mappings)
|
||||||
|
(linux_nat_info_proc_cmd_stat, linux_nat_info_proc_cmd_status)
|
||||||
|
(linux_nat_info_proc_cmd_cwd, linux_nat_info_proc_cmd_cmdline)
|
||||||
|
(linux_nat_info_proc_cmd_exe, linux_nat_info_proc_cmd_all): New.
|
||||||
|
(_initialize_linux_nat): New variable info_proc_cmdlist. Install `info
|
||||||
|
proc mappings', `info proc stat`, `info proc status', `info proc cwd',
|
||||||
|
`info proc cmdline', `info proc exe' and `info proc all' as real
|
||||||
|
subcommands of `info proc'.
|
||||||
|
|
||||||
2011-11-01 Justin Lebar <justin.lebar@gmail.com>
|
2011-11-01 Justin Lebar <justin.lebar@gmail.com>
|
||||||
|
|
||||||
* Makefile.in: (SFILES): Add skip.c.
|
* Makefile.in: (SFILES): Add skip.c.
|
||||||
|
|
215
gdb/linux-nat.c
215
gdb/linux-nat.c
|
@ -59,6 +59,7 @@
|
||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
#include "solib.h"
|
#include "solib.h"
|
||||||
#include "linux-osdata.h"
|
#include "linux-osdata.h"
|
||||||
|
#include "cli/cli-utils.h"
|
||||||
|
|
||||||
#ifndef SPUFS_MAGIC
|
#ifndef SPUFS_MAGIC
|
||||||
#define SPUFS_MAGIC 0x23c9b64e
|
#define SPUFS_MAGIC 0x23c9b64e
|
||||||
|
@ -4746,71 +4747,57 @@ linux_nat_make_corefile_notes (bfd *obfd, int *note_size)
|
||||||
|
|
||||||
/* Implement the "info proc" command. */
|
/* 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
|
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
|
/* A long is used for pid instead of an int to avoid a loss of precision
|
||||||
compiler warning from the output of strtoul. */
|
compiler warning from the output of strtoul. */
|
||||||
long pid = PIDGET (inferior_ptid);
|
long pid = PIDGET (inferior_ptid);
|
||||||
FILE *procfile;
|
FILE *procfile;
|
||||||
char **argv = NULL;
|
|
||||||
char buffer[MAXPATHLEN];
|
char buffer[MAXPATHLEN];
|
||||||
char fname1[MAXPATHLEN], fname2[MAXPATHLEN];
|
char fname1[MAXPATHLEN], fname2[MAXPATHLEN];
|
||||||
int cmdline_f = 1;
|
int cmdline_f = (what == IP_MINIMAL || what == IP_CMDLINE || what == IP_ALL);
|
||||||
int cwd_f = 1;
|
int cwd_f = (what == IP_MINIMAL || what == IP_CWD || what == IP_ALL);
|
||||||
int exe_f = 1;
|
int exe_f = (what == IP_MINIMAL || what == IP_EXE || what == IP_ALL);
|
||||||
int mappings_f = 0;
|
int mappings_f = (what == IP_MAPPINGS || what == IP_ALL);
|
||||||
int status_f = 0;
|
int status_f = (what == IP_STATUS || what == IP_ALL);
|
||||||
int stat_f = 0;
|
int stat_f = (what == IP_STAT || what == IP_ALL);
|
||||||
int all = 0;
|
|
||||||
struct stat dummy;
|
struct stat dummy;
|
||||||
|
|
||||||
if (args)
|
if (args && isdigit (args[0]))
|
||||||
{
|
pid = strtoul (args, &args, 10);
|
||||||
/* Break up 'args' into an argv array. */
|
|
||||||
argv = gdb_buildargv (args);
|
args = skip_spaces (args);
|
||||||
make_cleanup_freeargv (argv);
|
if (args && args[0])
|
||||||
}
|
error (_("Too many parameters: %s"), args);
|
||||||
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 (pid == 0)
|
if (pid == 0)
|
||||||
error (_("No current process: you must name one."));
|
error (_("No current process: you must name one."));
|
||||||
|
|
||||||
|
@ -4819,7 +4806,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
error (_("No /proc directory: '%s'"), fname1);
|
error (_("No /proc directory: '%s'"), fname1);
|
||||||
|
|
||||||
printf_filtered (_("process %ld\n"), pid);
|
printf_filtered (_("process %ld\n"), pid);
|
||||||
if (cmdline_f || all)
|
if (cmdline_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/cmdline", pid);
|
sprintf (fname1, "/proc/%ld/cmdline", pid);
|
||||||
if ((procfile = fopen (fname1, "r")) != NULL)
|
if ((procfile = fopen (fname1, "r")) != NULL)
|
||||||
|
@ -4835,7 +4822,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
else
|
else
|
||||||
warning (_("unable to open /proc file '%s'"), fname1);
|
warning (_("unable to open /proc file '%s'"), fname1);
|
||||||
}
|
}
|
||||||
if (cwd_f || all)
|
if (cwd_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/cwd", pid);
|
sprintf (fname1, "/proc/%ld/cwd", pid);
|
||||||
memset (fname2, 0, sizeof (fname2));
|
memset (fname2, 0, sizeof (fname2));
|
||||||
|
@ -4844,7 +4831,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
else
|
else
|
||||||
warning (_("unable to read link '%s'"), fname1);
|
warning (_("unable to read link '%s'"), fname1);
|
||||||
}
|
}
|
||||||
if (exe_f || all)
|
if (exe_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/exe", pid);
|
sprintf (fname1, "/proc/%ld/exe", pid);
|
||||||
memset (fname2, 0, sizeof (fname2));
|
memset (fname2, 0, sizeof (fname2));
|
||||||
|
@ -4853,7 +4840,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
else
|
else
|
||||||
warning (_("unable to read link '%s'"), fname1);
|
warning (_("unable to read link '%s'"), fname1);
|
||||||
}
|
}
|
||||||
if (mappings_f || all)
|
if (mappings_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/maps", pid);
|
sprintf (fname1, "/proc/%ld/maps", pid);
|
||||||
if ((procfile = fopen (fname1, "r")) != NULL)
|
if ((procfile = fopen (fname1, "r")) != NULL)
|
||||||
|
@ -4915,7 +4902,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
else
|
else
|
||||||
warning (_("unable to open /proc file '%s'"), fname1);
|
warning (_("unable to open /proc file '%s'"), fname1);
|
||||||
}
|
}
|
||||||
if (status_f || all)
|
if (status_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/status", pid);
|
sprintf (fname1, "/proc/%ld/status", pid);
|
||||||
if ((procfile = fopen (fname1, "r")) != NULL)
|
if ((procfile = fopen (fname1, "r")) != NULL)
|
||||||
|
@ -4929,7 +4916,7 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
else
|
else
|
||||||
warning (_("unable to open /proc file '%s'"), fname1);
|
warning (_("unable to open /proc file '%s'"), fname1);
|
||||||
}
|
}
|
||||||
if (stat_f || all)
|
if (stat_f)
|
||||||
{
|
{
|
||||||
sprintf (fname1, "/proc/%ld/stat", pid);
|
sprintf (fname1, "/proc/%ld/stat", pid);
|
||||||
if ((procfile = fopen (fname1, "r")) != NULL)
|
if ((procfile = fopen (fname1, "r")) != NULL)
|
||||||
|
@ -5029,6 +5016,70 @@ linux_nat_info_proc_cmd (char *args, int from_tty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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
|
/* Implement the to_xfer_partial interface for memory reads using the /proc
|
||||||
filesystem. Because we can use a single read() call for /proc, this
|
filesystem. Because we can use a single read() call for /proc, this
|
||||||
can be much more efficient than banging away at PTRACE_PEEKTEXT,
|
can be much more efficient than banging away at PTRACE_PEEKTEXT,
|
||||||
|
@ -5822,14 +5873,42 @@ extern initialize_file_ftype _initialize_linux_nat;
|
||||||
void
|
void
|
||||||
_initialize_linux_nat (void)
|
_initialize_linux_nat (void)
|
||||||
{
|
{
|
||||||
add_info ("proc", linux_nat_info_proc_cmd, _("\
|
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\
|
Show /proc process information about any running process.\n\
|
||||||
Specify any process id, or use the program being debugged by default.\n\
|
Specify any process id, or use the program being debugged by default."),
|
||||||
Specify any of the following keywords for detailed info:\n\
|
&info_proc_cmdlist, "info proc ",
|
||||||
mappings -- list of mapped memory regions.\n\
|
1/*allow-unknown*/, &infolist);
|
||||||
stat -- list a bunch of random process info.\n\
|
|
||||||
status -- list a different bunch of random process info.\n\
|
add_cmd ("mappings", class_info, linux_nat_info_proc_cmd_mappings, _("\
|
||||||
all -- list all available /proc info."));
|
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 ("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,
|
add_setshow_zinteger_cmd ("lin-lwp", class_maintenance,
|
||||||
&debug_linux_nat, _("\
|
&debug_linux_nat, _("\
|
||||||
|
|
Loading…
Reference in a new issue