3.2.0 release prep; pmap -d

This commit is contained in:
albert 2004-01-29 05:05:37 +00:00
parent 98f8cbd614
commit 74954d33e3
6 changed files with 71 additions and 28 deletions

View File

@ -17,10 +17,10 @@
VERSION := 3 VERSION := 3
SUBVERSION := 1 SUBVERSION := 2
MINORVERSION := 15 MINORVERSION := 0
TARVERSION := 3.1.15 TARVERSION := 3.2.0
LIBVERSION := 3.1.15 LIBVERSION := 3.2.0
############ vars ############ vars

1
NEWS
View File

@ -6,6 +6,7 @@ top: during a ^Z, the terminal was messed up #228822
future-proof the tty handling (thanks to Zhou Wei) future-proof the tty handling (thanks to Zhou Wei)
slabtop (Chris Rivera and Robert Love) #226778 rh114012a slabtop (Chris Rivera and Robert Love) #226778 rh114012a
pmap: detect the primary stack pmap: detect the primary stack
pmap: -d format
procps-3.1.14 --> procps-3.1.15 procps-3.1.14 --> procps-3.1.15

5
pmap.1
View File

@ -11,7 +11,8 @@ pmap \- report memory map of a process
.SH SYNOPSIS .SH SYNOPSIS
.nf .nf
pmap [-x] [-V] pids... pmap [ -x | -d ] [ -q ] pids...
pmap -V
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
@ -21,6 +22,8 @@ The pmap command reports the memory map of a process or processes.
.TS .TS
l l l. l l l.
-x extended Show the extended format. -x extended Show the extended format.
-d device Show the device format.
-q quiet Do not display some header/footer lines.
-V show version Displays version of program. -V show version Displays version of program.
.TE .TE

73
pmap.c
View File

@ -23,8 +23,11 @@
static void usage(void) NORETURN; static void usage(void) NORETURN;
static void usage(void){ static void usage(void){
fprintf(stderr, fprintf(stderr,
"Usage: pmap [-r] [-x] pid...\n" "Usage: pmap [-x | -d] [-q] pid...\n"
"-x show details\n" "-x show details\n"
"-d show offset and device number\n"
"-q quiet; less header/footer info\n"
"-V show the version number\n"
); );
exit(1); exit(1);
} }
@ -93,19 +96,25 @@ static int one_proc(unsigned pid){
char buf[32]; char buf[32];
char mapbuf[9600]; char mapbuf[9600];
unsigned long total_shared = 0ul; unsigned long total_shared = 0ul;
unsigned long total_private = 0ul; unsigned long total_private_readonly = 0ul;
unsigned long total_private_writeable = 0ul;
sprintf(buf,"/proc/%u/maps",pid); sprintf(buf,"/proc/%u/maps",pid);
if(!freopen(buf, "r", stdin)) return 1; if(!freopen(buf, "r", stdin)) return 1;
printf("%u: %s\n", pid, get_args(pid)); printf("%u: %s\n", pid, get_args(pid));
if(x_option)
printf("Address Kbytes RSS Anon Locked Mode Mapping\n"); if(x_option && !q_option)
printf("Address Kbytes RSS Anon Locked Mode Mapping\n");
if(d_option && !q_option)
printf("Address Kbytes Mode Offset Device Mapping\n");
while(fgets(mapbuf,sizeof mapbuf,stdin)){ while(fgets(mapbuf,sizeof mapbuf,stdin)){
char flags[32]; char flags[32];
char *tmp; // to clean up unprintables char *tmp; // to clean up unprintables
unsigned KLONG start, end, diff; unsigned KLONG start, end, diff;
unsigned long long pgoff; unsigned long long file_offset;
sscanf(mapbuf,"%"KLF"x-%"KLF"x %31s %Lx", &start, &end, flags, &pgoff); unsigned dev_major, dev_minor;
sscanf(mapbuf,"%"KLF"x-%"KLF"x %31s %Lx %x:%x", &start, &end, flags, &file_offset, &dev_major, &dev_minor);
tmp = strchr(mapbuf,'\n'); tmp = strchr(mapbuf,'\n');
if(tmp) *tmp='\0'; if(tmp) *tmp='\0';
tmp = mapbuf; tmp = mapbuf;
@ -116,7 +125,10 @@ static int one_proc(unsigned pid){
diff = end-start; diff = end-start;
if(flags[3]=='s') total_shared += diff; if(flags[3]=='s') total_shared += diff;
if(flags[3]=='p') total_private += diff; if(flags[3]=='p'){
if(flags[1]=='w') total_private_writeable += diff;
else total_private_readonly += diff;
}
// format used by Solaris 9 and procps-3.2.0+ // format used by Solaris 9 and procps-3.2.0+
if(flags[3] == 'p') flags[3] = '-'; if(flags[3] == 'p') flags[3] = '-';
@ -136,7 +148,24 @@ static int one_proc(unsigned pid){
flags, flags,
cp cp
); );
}else{ }
if(d_option){
const char *cp = strrchr(mapbuf,'/');
if(cp && cp[1]) cp++;
if(!cp) cp = anon_name(pid, start, diff);
printf(
(sizeof(KLONG)==8)
? "%016"KLF"x %7lu %s %016Lx %03x:%05x %s\n"
: "%08lx %7lu %s %016Lx %03x:%05x %s\n",
start,
(unsigned long)(diff>>10),
flags,
file_offset,
dev_major, dev_minor,
cp
);
}
if(!x_option && !d_option){
const char *cp = strchr(mapbuf,'/'); const char *cp = strchr(mapbuf,'/');
if(!cp) cp = anon_name(pid, start, diff); if(!cp) cp = anon_name(pid, start, diff);
printf( printf(
@ -151,26 +180,35 @@ static int one_proc(unsigned pid){
} }
} }
if(x_option){
if(x_option && !q_option){
if(sizeof(KLONG)==8){ if(sizeof(KLONG)==8){
printf("---------------- ------ ------ ------ ------\n"); printf("---------------- ------ ------ ------ ------\n");
printf( printf(
"total kB %15ld - %7ld %7ld\n", "total kB %15ld - - -\n",
(total_shared + total_private) >> 10, (total_shared + total_private_writeable + total_private_readonly) >> 10
total_shared >> 10,
total_private >> 10
); );
}else{ }else{
printf("-------- ------- ------- ------- -------\n"); printf("-------- ------- ------- ------- -------\n");
printf( printf(
"total kB %7ld - - -\n", "total kB %7ld - - -\n",
(total_shared + total_private) >> 10 (total_shared + total_private_writeable + total_private_readonly) >> 10
); );
} }
}else{
if(sizeof(KLONG)==8) printf(" total %16ldK\n", (total_shared + total_private) >> 10);
else printf(" total %8ldK\n", (total_shared + total_private) >> 10);
} }
if(d_option && !q_option){
printf(
"mapped %ldK writeable/private: %ldK shared: %ldK\n",
(total_shared + total_private_writeable + total_private_readonly) >> 10,
total_private_writeable >> 10,
total_shared >> 10
);
}
if(!x_option && !d_option && !q_option){
if(sizeof(KLONG)==8) printf(" total %16ldK\n", (total_shared + total_private_writeable + total_private_readonly) >> 10);
else printf(" total %8ldK\n", (total_shared + total_private_writeable + total_private_readonly) >> 10);
}
return 0; return 0;
} }
@ -236,6 +274,7 @@ int main(int argc, char *argv[]){
return 0; return 0;
} }
if(count<1) usage(); // no processes if(count<1) usage(); // no processes
if(d_option && x_option) usage();
u=0; u=0;
while(u<count) ret |= one_proc(pidlist[u++]); while(u<count) ret |= one_proc(pidlist[u++]);

View File

@ -1,15 +1,15 @@
Begin4 Begin4
Title: procps Title: procps
Version: 3.1.15 Version: 3.2.0
Entered-date: 2003-12-24 Entered-date: 2004-1-29
Description: Linux system utilities Description: Linux system utilities
Keywords: procps /proc libproc sysctl pmap ps uptime tload Keywords: procps /proc libproc sysctl pmap ps uptime tload
free w top vmstat watch skill snice kill pgrep pkill free w top vmstat watch skill snice kill pgrep pkill
Author: Albert Cahalan, Michael K. Johnson, Jim Warner, etc. Author: Albert Cahalan, Michael K. Johnson, Jim Warner, etc.
Maintained-by: various <procps-feedback@lists.sf.net> Maintained-by: various <procps-feedback@lists.sf.net>
Primary-site: http://procps.sf.net/ Primary-site: http://procps.sf.net/
242kB procps-3.1.15.tar.gz 242kB procps-3.2.0.tar.gz
Alternate-site: http://www.debian.org/Packages/unstable/base/procps.html Alternate-site: http://www.debian.org/Packages/unstable/base/procps.html
242kB procps-3.1.15.tar.gz 242kB procps-3.2.0.tar.gz
Copying-policy: mixed Copying-policy: mixed
End End

View File

@ -2,8 +2,8 @@ URL: http://procps.sf.net/
Summary: System and process monitoring utilities Summary: System and process monitoring utilities
Name: procps Name: procps
%define major_version 3 %define major_version 3
%define minor_version 1 %define minor_version 2
%define revision 15 %define revision 0
%define version %{major_version}.%{minor_version}.%{revision} %define version %{major_version}.%{minor_version}.%{revision}
Version: %{version} Version: %{version}
Release: 1 Release: 1