• Showing Page History #6565

Show page source of FrontPage #6561

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

== コレは何? ==
!CloseHandle忘れや、fclose忘れなどのオブジェクトリークを自働検出します。

== どうやって使うの? ==
stdafx.h みたいなすべてのファイルから参照されるヘッダーファイルに[[BR]]
[[BR]]
#include "obcheck.h"	//オブジェクトリークチェッカー[[BR]]
[[BR]]
と、記述してください。デバッグビルド時に、リークしているかもしれないオブジェクトを表示します。リリースビルド時には無力化されます。

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

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


== どうやって実装しているの? ==
自分自身に API フックをかけて、フックした内部でスタックトレースをしてソースコードを突き止めています。[[BR]]
(もしかしたら、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フック と スタックトレースっていう重い方法で実装いたしました。


=== 誤検出や検出漏れがありました!! ===
誤検出や検出漏れの内容を報告してください。
出来るだけの対処は行いたいと思います。

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

== 歴史 ==

0.1
初期リリース