changelog shortlog tags branches changeset files revisions annotate raw help

Mercurial > hg > plan9front / rc/bin/leak

changeset 7243: 34f64dcbbc25
parent: efddda59690a
author: cinap_lenrek@felloff.net
date: Fri, 17 May 2019 18:14:10 +0200
permissions: -rwxr-xr-x
description: 7l: don't hardcode 4k pagesize, use INITRND
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 }