正式にアンロードされていないのにメモリ上に存在しなかったDLLのケース、パート2
2つのバグが連鎖して、DLLが正式にアンロードされていないにもかかわらずメモリ上から消えてしまうという不可解な問題を解説。パート2では、その原因となった2つのバグの相互作用について詳しく掘り下げる。
背景メモ
- この記事は、マイクロソフトのベテランエンジニアRaymond Chenが運営するブログ「The Old New Thing」のシリーズの一部。同ブログはWindowsプラットフォームの内部動作や歴史的な設計判断を、開発者向けに解説することで有名。
- 「DLLがメモリ上に存在しないのに、正式にはアンロードされていない」という一見矛盾する現象の原因を、2つの異なるバグが絡み合って引き起こしたケースとして分析している。
- WindowsにおけるDLLのロード/アンロード管理は、参照カウント方式で行われており、通常は明示的な解放(FreeLibraryなど)かプロセス終了時にのみDLLがメモリから除去される。ここで扱われているのは、その想定を破るエッジケース。
- このような低レベルのメモリ管理やDLLのライフサイクルの話題は、特にC++/Win32のネイティブ開発者や、デバッグが困難なメモリ関連の障害を追っているエンジニアにとって実践的な価値が高い。