diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 17:14:36 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 17:14:36 +0300 |
commit | 2959e1ede0ebc6fdffd7b8660f43c2ce14c9696f (patch) | |
tree | f6343b1ce11a8c87251dd27cf3d3e26b50693fa7 /rc/bin/leak | |
parent | e463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (diff) |
Import sources from 2011-03-30 iso image - rc
Diffstat (limited to 'rc/bin/leak')
-rwxr-xr-x | rc/bin/leak | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/rc/bin/leak b/rc/bin/leak new file mode 100755 index 000000000..adccd7807 --- /dev/null +++ b/rc/bin/leak @@ -0,0 +1,95 @@ +#!/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 +} |