95 lines
1.9 KiB
Bash
95 lines
1.9 KiB
Bash
#!/bin/rc
|
|
|
|
rfork e
|
|
|
|
flagfmt='a,b,c,d,s,f binary,r res,x width'
|
|
args='name | pid list'
|
|
if(! ifs=() eval `{aux/getflags $*} || ~ $#* 0){
|
|
aux/usage
|
|
exit usage
|
|
}
|
|
|
|
conflicting=($flagb $flagc $flags)
|
|
if(~ $#conflicting 2 || ~ $#conflicting 3){
|
|
echo 'can only use one of -b, -c or -s' >[1=2]
|
|
exit usage
|
|
}
|
|
|
|
leakflags=()
|
|
if(~ $#flags 1)
|
|
leakflags=($leakflags -s)
|
|
if(~ $#flaga 1)
|
|
leakflags=($leakflags -a)
|
|
if(~ $#flagc 1)
|
|
leakflags=($leakflags -c)
|
|
if(~ $#flagd 1)
|
|
leakflags=($leakflags -d)
|
|
if(~ $#flagf 1)
|
|
leakflags=($leakflags -f $flagf)
|
|
|
|
acidleakflags=()
|
|
if(~ $#flagb 1)
|
|
acidleakflags=($acidleakflags -b)
|
|
if(~ $#flagr 1)
|
|
acidleakflags=($acidleakflags -r $flagr)
|
|
if(~ $#flagx 1)
|
|
acidleakflags=($acidleakflags -x $flagx)
|
|
|
|
if(! test -d /proc/$1) {
|
|
# x=`{psu | awk '$NF=="'$1'" {print $2}'}
|
|
x=`{psu | grep ' '$1'$' | sed 's/^[^ ]+ +([0-9]+).*/\1/'}
|
|
if(~ $#x 0) {
|
|
echo 'no processes named '$1 >[1=2]
|
|
exit usage
|
|
}
|
|
echo leak $leakflags $acidleakflags $x
|
|
exit
|
|
}
|
|
|
|
pidlist=`{echo $"* | tr ' ' ,}
|
|
|
|
echo 'leakdump({'$pidlist'})' | acid -lpool -lleak $1 $flagf |
|
|
{
|
|
if(~ $#flaga 1 && ~ $#flagd 1)
|
|
grep 'block|free'
|
|
if not
|
|
if(~ $#flaga 1)
|
|
grep block
|
|
if not
|
|
if(~ $#flagd 1)
|
|
grep free
|
|
if not
|
|
aux/acidleak $acidleakflags $flagf
|
|
} |
|
|
{
|
|
if(~ $#flags 1)
|
|
awk '{print $4}' |
|
|
sort | uniq -c | sort -nr |
|
|
sed 's! *(.*) (0x.*)!src(\2); // \1!'
|
|
if not
|
|
if(~ $#flagc 1)
|
|
awk 'BEGIN {
|
|
for(i=0; i<16; i++)
|
|
_unhex[sprintf("%x", i)] = _unhex[sprintf("%X", i)] = i
|
|
}
|
|
function unhex(s, i, v) {
|
|
sub("^0[xX]0*","",s)
|
|
for (i=1; i<=length(s); i++)
|
|
v = v*16 + _unhex[substr(s,i,1)]
|
|
return v
|
|
}
|
|
{ sum[$4] += unhex($3);
|
|
count[$4]++;
|
|
alloc[$4] = $6;
|
|
}
|
|
END {
|
|
for (v in sum) {
|
|
printf("src(%s);\t// %d\t%d\t%d\t%s\n", v, sum[v], count[v], sum[v] / count[v], alloc[v])
|
|
total += sum[v]
|
|
}
|
|
printf("// %d\n", total);
|
|
}
|
|
' | sort -nr +2
|
|
if not
|
|
cat
|
|
}
|