正式にアンロードされていないにもかかわらずメモリ上に存在しなかったDLL
この記事では、DLLが明示的にアンロードされていないにもかかわらず、メモリ上で見つからなくなるという一見矛盾した状況について解説しています。この現象の原因として、システムがリソースを管理する方法や、DLLのロード/アンロードにおける特定の条件下での動作の詳細を掘り下げています。
背景メモ
- この記事は、マイクロソフトのエンジニアであるRaymond Chen氏(「Old New Thing」ブログで有名)が、WindowsにおけるDLL(Dynamic Link Library)のメモリ管理にまつわる奇妙な振る舞いを解説したもの。
- Windowsでは通常、DLLを使っているプロセスがすべて閉じると、そのDLLはメモリから自動的にアンロードされる。ところが特定条件下で、DLLが「正式にアンロードされていないのに、メモリ上に存在しない」状態が発生しうる。
- その原因として、DLLの初期化コード(DllMain)内でCreateThread()を使ってスレッドを生成した後、そのスレッドがDLLの参照カウントを増やしたまま終了してしまうケースが挙げられている。DLLの参照カウントが残っているためWindowsはアンロードできないが、当のDLLは実質的にアンロードされたのと同じ状態になる。
- この話題は、Windowsプログラマーにとってはデバッグが極めて困難な「ゴーストDLL」問題として知られており、DLLのライフサイクル管理の落とし穴を理解するうえで重要な教訓を含む。