obcheck (0.1) | 2007-11-03 17:21 |
CloseHandle忘れや、fclose忘れなどのオブジェクトリークを自働検出します。
stdafx.h みたいなすべてのファイルから参照されるヘッダーファイルに
#include "obcheck.h" //オブジェクト リーク チェッカー
と、記述してください。デバッグビルド時に、リークしているかもしれないオブジェクトを表示します。リリースビルド時には無力化されます。
(内部でスレッドを生成しているので、シングルスレッドのプログラムに組み込む場合、 プロジェクトの設定でマルチスレッドに切り替えてください)
youtube にデモを上げました。
http://www.youtube.com/watch?v=Uu-EDiiW_iQ
自分自身に API フックをかけて、フックした内部でスタックトレースをしてソースコードを突き止めています。
(もしかしたら、NX BIT な環境で動かないかもしれません。環境が無いので検証できていません。)
エラーメッセージをコピペして報告してください。
Microsoft の dbghelp.dll のバージョンによってはうまくいかない場合があるようです。 過去のバージョンでうまく動作するのに最新のバージョンで動作しない場合があったりします。
こちらでは次のバージョンで動作を確認しています。 dbghelp.dll 5.0.2195.6613
一応対策として、次の方法があります。 リークの表示で: {123} Object:000003AC とかなっているところの {123}は確保番号になっています。 プログラムの最初で Obcheck_SetBreakCount(123); と、やると、{123} 番目のオブジェクトが確保されたときにブレークします。 これを利用して手動で場所を特定してください。
Debugging Tools for Windows を入れるとインストールされます。
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx から入れるダウンロードしてください。
スタックトレースにスレッドが必要になるので、オーバーヘッドがどうしてもあります。 スレッドプール等を行うともう少し速度は出せるとは思いますが、まだ実装をしていません。
確かに常時使うと重すぎるので、マイルストーンなどをリリースする前に有効にし、 チェックするなどの利用をされてはいかがでしょうか。
未公開の初期版は define で実装したのですが、それではランタイム等の中まで調査することができません。 現在、自分自身のプロセスのみを監視していますが、将来的には、読み込んだ dll の中まで監視するつもりでいます。 そのため、APIフック と スタックトレースっていう重い方法で実装いたしました。
誤検出や検出漏れの内容を報告してください。出来るだけの対処は行いたいと思います。
報告先
http://sourceforge.jp/tracker/index.php?group_id=3175&atid=11793&func=add