Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}