]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/leak
audio(1): replace references to juke(7) and playlistfs(7) with zuke(1) (thanks unobe)
[plan9front.git] / rc / bin / leak
1 #!/bin/rc
2
3 rfork e
4
5 flagfmt='a,b,c,d,s,f binary,r res,x width'
6 args='name | pid list'
7 if(! ifs=() eval `{aux/getflags $*} || ~ $#* 0){
8         aux/usage
9         exit usage
10 }
11
12 conflicting=($flagb $flagc $flags)
13 if(~ $#conflicting 2 || ~ $#conflicting 3){
14         echo 'can only use one of -b, -c or -s' >[1=2]
15         exit usage
16 }
17
18 leakflags=()
19 if(~ $#flags 1)
20         leakflags=($leakflags -s)
21 if(~ $#flaga 1)
22         leakflags=($leakflags -a)
23 if(~ $#flagc 1)
24         leakflags=($leakflags -c)
25 if(~ $#flagd 1)
26         leakflags=($leakflags -d)
27 if(~ $#flagf 1)
28         leakflags=($leakflags -f $flagf)
29
30 acidleakflags=()
31 if(~ $#flagb 1)
32         acidleakflags=($acidleakflags -b)
33 if(~ $#flagr 1)
34         acidleakflags=($acidleakflags -r $flagr)
35 if(~ $#flagx 1)
36         acidleakflags=($acidleakflags -x $flagx)
37
38 if(! test -d /proc/$1) {
39         # x=`{psu | awk '$NF=="'$1'" {print $2}'}
40         x=`{psu | grep ' '$1'$' | sed 's/^[^ ]+ +([0-9]+).*/\1/'}
41         if(~ $#x 0) {
42                 echo 'no processes named '$1 >[1=2]
43                 exit usage
44         }
45         echo leak $leakflags $acidleakflags $x
46         exit
47 }
48
49 pidlist=`{echo $"* | tr ' ' ,}
50
51 echo 'leakdump({'$pidlist'})' | acid -lpool -lleak $1 $flagf | 
52 {
53         if(~ $#flaga 1 && ~ $#flagd 1)
54                 grep 'block|free'
55         if not
56         if(~ $#flaga 1)
57                 grep block
58         if not
59         if(~ $#flagd 1)
60                 grep free 
61         if not
62                 aux/acidleak $acidleakflags $flagf
63 } |
64 {
65         if(~ $#flags 1)
66                 awk '{print $4}' |
67                         sort | uniq -c | sort -nr |
68                         sed 's! *(.*) (0x.*)!src(\2); // \1!'
69         if not
70         if(~ $#flagc 1)
71                 awk 'BEGIN {
72                                 for(i=0; i<16; i++)
73                                         _unhex[sprintf("%x", i)] = _unhex[sprintf("%X", i)] = i
74                         }
75                         function unhex(s, i, v) {
76                                 sub("^0[xX]0*","",s)
77                                 for (i=1; i<=length(s); i++)
78                                         v = v*16 + _unhex[substr(s,i,1)]
79                                 return v
80                         }
81                         {       sum[$4] += unhex($3);
82                                 count[$4]++;
83                                 alloc[$4] = $6;
84                         }
85                         END {
86                                 for (v in sum) {
87                                         printf("src(%s);\t// %d\t%d\t%d\t%s\n", v, sum[v], count[v], sum[v] / count[v], alloc[v])
88                                         total += sum[v]
89                                 }
90                                 printf("// %d\n", total);
91                         }
92                 '  | sort -nr +2
93         if not
94                 cat
95 }