メモリリークとか

ふと GC って動作中のソフトのメモリリーク検出に使えるよなー、とこないだふと思ったのが一つあって、まぁ実のところそんなもん誰でも思いつくわけで LL の最中に Boehm GC 眺めてたら、やっぱそういうフラグがあって、 GC_find_leak = 1; とかしてから GC_gcollect(); とかするとリークしたメモリのアドレスを表示したりしてくれるみたいだった。

でまぁ id:w_o さんがそのへんにいるわけで捕捉してほげほげーと言うと、当然のように Boehm GC にそいう機能あるよ的に言われて、やはり気付くの遅すぎ系だなぁと思いつつ、つまりリークしたメモリのアドレスなんかより確保した時のアドレスを出したくて、それには malloc 奪わんとですよねとかそのへんについて少し話をしました全然 LL ぽくない。

イマイチまとまらんのだけど考えたこととかを整理。

  • 確保したメモリアドレスから後から PC 調べるのはデバッグ情報とか用意しといてもそりゃ無理だろうから、 malloc なり GC_malloc 奪う必要がある。
  • 呼び出し元を記録するだけのアプローチだとライブラリで malloc してるとギャーなので malloc のたびにスタックトレース残す必要が。
  • 動作中のソフトをチェックしたいんなら GC 的なことする必要がある。
  • でも確保したメモリからスタックトレースへのハッシュとかを適当に作ると、その部分を GC が見てああまだ開放しなくていいなと勘違いする恐れが。
  • GC 的なこと」を外部から ptrace でやるってのもできるっちゃできる。確保した時のスタックトレースとかはもちろん無いけど。
  • 動作終了時にチェックしたいだけなら malloc と free の上書きだけやれば OK 。つか valgrind とか その他もろもろのメモリ監視ツール群 で OK 。
  • 実はリークのチェックの他に、大きなソフトのどこがメモリ使用量のボトルネックになっているか、も知りたい。

まとめると、動作終了時のリークチェックは valgrind でいいとして、動作中のプロセスのリークチェックと、動作中プロセスのメモリ使用量ボトルネックが知りたいわけだ。

いかにも既に valgrind の拡張とかでありそうだけどはてさて。まぁ何が欲しいかはわかったのでまた今度。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h