From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31024 invoked by alias); 28 Dec 2001 19:48:34 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 30975 invoked from network); 28 Dec 2001 19:48:29 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 28 Dec 2001 19:48:29 -0000 Received: from redhat.com (reddwarf.cygnus.com [205.180.231.12]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id LAA20316; Fri, 28 Dec 2001 11:48:24 -0800 (PST) Message-ID: <3C2CCB8D.AB879601@redhat.com> Date: Fri, 28 Dec 2001 11:48:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.4.2-2smp i686) X-Accept-Language: en MIME-Version: 1.0 To: Michael Snyder CC: gdb-patches@sources.redhat.com Subject: Re: [PATCH/RFC] Add back the 'info proc mappings' command. References: <200112212259.OAA18720@cleaver.cygnus.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2001-12/txt/msg00597.txt.bz2 Michael Snyder wrote: > > This adds back a sub-command ('mappings') of the "info proc" > command, which was lost a couple years ago when procfs.c was > rewritten. There are a bunch of other sub-commands that could > also be added back in -- I just happened to need this one. > > I'll wait a week for objections before I check it in. Committed. > 2001-12-21 Michael Snyder > > * procfs.c (info_proc_cmd): Add the 'mappings' sub-command that > was dropped a few years ago, when procfs.c was rewritten. > (info_proc_mappings): New function, implent 'info proc mappings'. > (mappingflags): New function. > (_initialize_procfs): Document new option to 'info proc' command. > > Index: procfs.c > =================================================================== > RCS file: /cvs/src/src/gdb/procfs.c,v > retrieving revision 1.32 > diff -c -3 -p -r1.32 procfs.c > *** procfs.c 2001/07/07 21:55:28 1.32 > --- procfs.c 2001/12/21 22:57:30 > *************** proc_set_watchpoint (procinfo *pi, CORE_ > *** 2879,2889 **** > * or zero. > */ > > - /* FIXME: it's probably a waste to cache this FD. > - It doesn't get called that often... and if I open it > - every time, I don't need to lseek it. */ > int > ! proc_iterate_over_mappings (int (*func) (int, CORE_ADDR)) > { > struct prmap *map; > procinfo *pi; > --- 2879,2886 ---- > * or zero. > */ > > int > ! proc_iterate_over_mappings (int (*func) (int, CORE_ADDR) > { > struct prmap *map; > procinfo *pi; > *************** procfs_find_LDT_entry (ptid_t ptid) > *** 5310,5327 **** > } > #endif /* TM_I386SOL2_H */ > > > > static void > info_proc_cmd (char *args, int from_tty) > { > struct cleanup *old_chain; > ! procinfo *process = NULL; > ! procinfo *thread = NULL; > ! char **argv = NULL; > ! char *tmp = NULL; > ! int pid = 0; > ! int tid = 0; > > old_chain = make_cleanup (null_cleanup, 0); > if (args) > --- 5307,5448 ---- > } > #endif /* TM_I386SOL2_H */ > > + /* > + * Function: mappingflags > + * > + * Returns an ascii representation of a memory mapping's flags. > + */ > + > + static char * > + mappingflags (flags) > + long flags; > + { > + static char asciiflags[8]; > + > + strcpy (asciiflags, "-------"); > + #if defined (MA_PHYS) > + if (flags & MA_PHYS) > + asciiflags[0] = 'd'; > + #endif > + if (flags & MA_STACK) > + asciiflags[1] = 's'; > + if (flags & MA_BREAK) > + asciiflags[2] = 'b'; > + if (flags & MA_SHARED) > + asciiflags[3] = 's'; > + if (flags & MA_READ) > + asciiflags[4] = 'r'; > + if (flags & MA_WRITE) > + asciiflags[5] = 'w'; > + if (flags & MA_EXEC) > + asciiflags[6] = 'x'; > + return (asciiflags); > + } > + > + /* > + * Function: info_proc_mappings > + * > + * Implement the "info proc mappings" subcommand. > + */ > + > + static void > + info_proc_mappings (procinfo *pi, int summary) > + { > + char *header_fmt_string, *data_fmt_string; > + char pathname[MAX_PROC_NAME_SIZE]; > + struct prmap *prmaps; > + struct prmap *prmap; > + int map_fd; > + int nmap; > + #ifdef NEW_PROC_API > + struct stat sbuf; > + #endif > + > + if (TARGET_PTR_BIT == 32) > + { > + header_fmt_string = "\t%10s %10s %10s %10s %7s\n"; > + data_fmt_string = "\t%#10lx %#10lx %#10x %#10x %7s\n"; > + } > + else > + { > + header_fmt_string = " %18s %18s %10s %10s %7s\n"; > + data_fmt_string = " %#18lx %#18lx %#10x %#10x %7s\n"; > + } > + > + if (summary) > + return; /* No output for summary mode. */ > + > + /* Get the number of mappings, allocate space, > + and read the mappings into prmaps. */ > + #ifdef NEW_PROC_API > + /* Open map fd. */ > + sprintf (pathname, "/proc/%d/map", pi->pid); > + if ((map_fd = open (pathname, O_RDONLY)) < 0) > + return; /* Can't open map file. */ > + /* Make sure it gets closed again. */ > + make_cleanup_close (map_fd); > + > + /* Use stat to determine the file size, and compute > + the number of prmap_t objects it contains. */ > + if (fstat (map_fd, &sbuf) != 0) > + return; /* Can't stat file. */ > + > + nmap = sbuf.st_size / sizeof (prmap_t); > + prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps)); > + if (read (map_fd, (char *) prmaps, nmap * sizeof (*prmaps)) > + != (nmap * sizeof (*prmaps))) > + return; /* Can't read file. */ > + #else > + /* Use ioctl command PIOCNMAP to get number of mappings. */ > + if (ioctl (pi->ctl_fd, PIOCNMAP, &nmap) != 0) > + return; /* Can't get number of mappings. */ > + prmaps = (struct prmap *) alloca ((nmap + 1) * sizeof (*prmaps)); > + if (ioctl (pi->ctl_fd, PIOCMAP, prmaps) != 0) > + return; /* Can't read mappings. */ > + #endif > + > + printf_filtered ("Mapped address spaces:\n\n"); > + printf_filtered (header_fmt_string, > + "Start Addr", > + " End Addr", > + " Size", > + " Offset", > + "Flags"); > + > + for (prmap = prmaps; nmap > 0; prmap++, nmap--) > + { > + printf_filtered (data_fmt_string, > + (unsigned long) prmap->pr_vaddr, > + (unsigned long) prmap->pr_vaddr > + + prmap->pr_size - 1, > + prmap->pr_size, > + #ifdef PCAGENT /* Gross hack: only defined on Solaris 2.6+ */ > + (unsigned int) prmap->pr_offset, > + #else > + prmap->pr_off, > + #endif > + mappingflags (prmap->pr_mflags)); > + } > + printf_filtered ("\n"); > + } > > + /* > + * Function: info_proc_cmd > + * > + * Implement the "info proc" command. > + */ > > static void > info_proc_cmd (char *args, int from_tty) > { > struct cleanup *old_chain; > ! procinfo *process = NULL; > ! procinfo *thread = NULL; > ! char **argv = NULL; > ! char *tmp = NULL; > ! int pid = 0; > ! int tid = 0; > ! int mappings = 0; > > old_chain = make_cleanup (null_cleanup, 0); > if (args) > *************** info_proc_cmd (char *args, int from_tty) > *** 5343,5348 **** > --- 5464,5473 ---- > { > tid = strtoul (argv[0] + 1, NULL, 10); > } > + else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0) > + { > + mappings = 1; > + } > else > { > /* [...] */ > *************** info_proc_cmd (char *args, int from_tty) > *** 5389,5394 **** > --- 5514,5524 ---- > proc_prettyprint_why (proc_why (thread), proc_what (thread), 1); > } > > + if (mappings) > + { > + info_proc_mappings (process, 0); > + } > + > do_cleanups (old_chain); > } > > *************** _initialize_procfs (void) > *** 5466,5473 **** > init_procfs_ops (); > add_target (&procfs_ops); > add_info ("proc", info_proc_cmd, > ! "Show /proc process information about any running process.\ > ! Default is the process being debugged."); > 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, > --- 5596,5604 ---- > init_procfs_ops (); > add_target (&procfs_ops); > 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,