leak 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/bin/rc
  2. rfork e
  3. flagfmt='b,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. if(~ $#flags 1 && ~ $#flagb 1){
  10. echo 'cannot use both -b and -s' >[1=2]
  11. exit usage
  12. }
  13. leakflags=()
  14. if(~ $#flags 1)
  15. leakflags=($leakflags -s)
  16. if(~ $#flagf 1)
  17. leakflags=($leakflags -f $flagf)
  18. acidleakflags=()
  19. if(~ $#flagb 1)
  20. acidleakflags=($acidleakflags -b)
  21. if(~ $#flagr 1)
  22. acidleakflags=($acidleakflags -r $flagr)
  23. if(~ $#flagx 1)
  24. acidleakflags=($acidleakflags -x $flagx)
  25. if(! test -d /proc/$1) {
  26. # x=`{psu | awk '$NF=="'$1'" {print $2}'}
  27. x=`{psu | grep ' '$1'$' | sed 's/^[^ ]+ +([0-9]+).*/\1/'}
  28. if(~ $#x 0) {
  29. echo 'no processes named '$1 >[1=2]
  30. exit usage
  31. }
  32. echo leak $leakflags $acidleakflags $x
  33. exit
  34. }
  35. pidlist=`{echo $"* | tr ' ' ,}
  36. echo 'leakdump({'$pidlist'})' |
  37. acid -lpool -lleak $1 $flagf |
  38. aux/acidleak $acidleakflags $flagf |
  39. {
  40. if(~ $#flags 1)
  41. awk '{print $4}' |
  42. sort | uniq -c | sort -nr |
  43. sed 's! *(.*) (0x.*)!src(\2); // \1!'
  44. if not
  45. cat
  46. }