#!/usr/bin/perl -wT # Parse /proc/*/maps file into a readable summary. # $Id: maps.pl,v 1.1 2006/11/01 10:35:56 rich Exp $ no warnings qw(portable); foreach my $filename (@ARGV) { my %devices; open MAPS, "<$filename" or die "$filename: $!"; while () { if (m/^([[:xdigit:]]+)-([[:xdigit:]]+) ([-rwxps]+) ([[:xdigit:]]+) ([[:xdigit:]]{2}:[[:xdigit:]]{2}) (\d+)\s*(.*)?/) { my $start = hex $1; my $end = hex $2; my $perms = $3; my $offset = hex $4; my $device = $5; my $inode = $6; my $filename = $7; my $size = $end - $start; # Create a record. my %rec = ( start => $start, end => $end, perms => $perms, offset => $offset, device => $device, inode => $inode, filename => $filename, size => $size ); # Key for storing this. my $key; if ($device ne "00:00" && $inode != 0) { $key = "$filename ($device $inode)" } elsif ($filename ne "") { $key = $filename } else { $key = "anonymous mapping" } # Store it. $devices{$key} = [] if !exists $devices{$key}; push @{$devices{$key}}, \%rec } else { warn "ignored: $_\n" } } close MAPS; # Get the list of devices. my @devices = keys %devices; # For each device, print a summary. foreach (@devices) { print "$_:\n"; my @recs = @{$devices{$_}}; my $sum = 0; $sum += $_->{size} foreach @recs; printf (" %d bytes %.1f MB\n", $sum, $sum/1024/1024); print " segments:\n"; foreach (@recs) { printf (" %x-%x (%d bytes %.1f MB) %s %d\n", $_->{start}, $_->{end}, $_->{size}, $_->{size}/1024/1024, $_->{perms}, $_->{offset}); } } }