オブジェクト リーク チェッカー

English

コレは何?

CloseHandle忘れや、fclose忘れなどのオブジェクトリークを自働検出します。

どうやって使うの?

stdafx.h みたいなすべてのファイルから参照されるヘッダーファイルに

#include "obcheck.h" //オブジェクト リーク チェッカー

と、記述してください。デバッグビルド時に、リークしているかもしれないオブジェクトを表示します。リリースビルド時には無力化されます。

(内部でスレッドを生成しているので、シングルスレッドのプログラムに組み込む場合、 プロジェクトの設定でマルチスレッドに切り替えてください)

youtube にデモを上げました。
http://www.youtube.com/watch?v=Uu-EDiiW_iQ

どうやって実装しているの?

自分自身に API フックをかけて、フックした内部でスタックトレースをしてソースコードを突き止めています。
(もしかしたら、NX BIT な環境で動かないかもしれません。環境が無いので検証できていません。)

FAQ

コンパイルエラーになりました。

エラーメッセージをコピペして報告してください。

ソースコードの行数が表示されない。

Microsoft の dbghelp.dll のバージョンによってはうまくいかない場合があるようです。 過去のバージョンでうまく動作するのに最新のバージョンで動作しない場合があったりします。

こちらでは次のバージョンで動作を確認しています。 dbghelp.dll 5.0.2195.6613

一応対策として、次の方法があります。 リークの表示で: {123} Object:000003AC とかなっているところの {123}は確保番号になっています。 プログラムの最初で Obcheck_SetBreakCount(123); と、やると、{123} 番目のオブジェクトが確保されたときにブレークします。 これを利用して手動で場所を特定してください。

ダイナミック ライブラリ dbghelp.dll が見つからないとかエラーがでました。

Debugging Tools for Windows を入れるとインストールされます。
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx から入れるダウンロードしてください。

プログラムに組み込んでみたら動作がとても遅くなったのですが。

スタックトレースにスレッドが必要になるので、オーバーヘッドがどうしてもあります。 スレッドプール等を行うともう少し速度は出せるとは思いますが、まだ実装をしていません。

確かに常時使うと重すぎるので、マイルストーンなどをリリースする前に有効にし、 チェックするなどの利用をされてはいかがでしょうか。

なぜ define で実装しなかったのか?

未公開の初期版は define で実装したのですが、それではランタイム等の中まで調査することができません。 現在、自分自身のプロセスのみを監視していますが、将来的には、読み込んだ dll の中まで監視するつもりでいます。 そのため、APIフック と スタックトレースっていう重い方法で実装いたしました。

誤検出や検出漏れがありました!!

誤検出や検出漏れの内容を報告してください。出来るだけの対処は行いたいと思います。
報告先
http://sourceforge.jp/tracker/index.php?group_id=3175&atid=11793&func=add

今後

  • リークが多いと思われるGDI周り対応
  • うに(unicode)対応
  • FAQをみさくら語にする

歴史

  • 0.1 初期リリース