bloatcheck 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/bin/bash
  2. if [ $# -ne 2 ]
  3. then
  4. echo "usage: bloatcheck old new"
  5. exit 1
  6. fi
  7. addline()
  8. {
  9. NEXT="$(printf "%s% $((50-${#LASTNAME}))d% 10d %10d" "$LASTNAME" "$OLD" "$NEW" "$DELTA")"
  10. [ -z "$STUFF" ] &&
  11. STUFF="$NEXT" ||
  12. STUFF="$(printf "%s\n%s" "$STUFF" "$NEXT")"
  13. }
  14. do_bloatcheck()
  15. {
  16. LASTNAME=
  17. DELTA=0
  18. TOTAL=0
  19. OLD=0
  20. NEW=0
  21. STUFF=
  22. printf "name% 46s% 10s% 11s\n" old new delta
  23. echo "-----------------------------------------------------------------------"
  24. while read a b c d
  25. do
  26. THISNAME=$(echo "$d" | sed 's/[.][0-9]*$//')
  27. if [ "$LASTNAME" != "$THISNAME" ]
  28. then
  29. TOTAL=$(($TOTAL+$DELTA))
  30. [ $DELTA -ne 0 ] && addline
  31. LASTNAME="$THISNAME"
  32. DELTA=0
  33. OLD=0
  34. NEW=0
  35. fi
  36. SIZE=$(printf "%d" "0x$b")
  37. if [ "$a" == "-" ]
  38. then
  39. OLD=$(($OLD+$SIZE))
  40. SIZE=$((-1*$SIZE))
  41. else
  42. NEW=$(($NEW+$SIZE))
  43. fi
  44. DELTA=$(($DELTA+$SIZE))
  45. done
  46. TOTAL=$(($TOTAL+$DELTA))
  47. [ $DELTA -ne 0 ] && addline
  48. echo "$STUFF" | sort -k4,4nr
  49. echo "-----------------------------------------------------------------------"
  50. printf "% 71d total\n" "$TOTAL"
  51. }
  52. DIFF1=`mktemp base.XXXXXXX`
  53. DIFF2=`mktemp bloat.XXXXXXX`
  54. trap "rm $DIFF1 $DIFF2" EXIT
  55. nm --size-sort "$1" | sort -k3,3 > $DIFF1
  56. nm --size-sort "$2" | sort -k3,3 > $DIFF2
  57. diff -U 0 $DIFF1 $DIFF2 | tail -n +3 | sed -n 's/^\([-+]\)/\1 /p' \
  58. | sort -k4,4 | do_bloatcheck