summaryrefslogtreecommitdiff
path: root/rc/bin/leak
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
commit2959e1ede0ebc6fdffd7b8660f43c2ce14c9696f (patch)
treef6343b1ce11a8c87251dd27cf3d3e26b50693fa7 /rc/bin/leak
parente463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (diff)
Import sources from 2011-03-30 iso image - rc
Diffstat (limited to 'rc/bin/leak')
-rwxr-xr-xrc/bin/leak95
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
+}