leak 1.9 KB

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