尽管未正式卸载,DLL 却已不在内存中
本文讨论了 Windows 中一种罕见情况:某个 DLL 虽然从未被正式卸载,却已从进程的内存空间中消失。作者深入分析了造成此现象的系统机制及调试思路,帮助开发者理解内存管理和 DLL 加载/卸载的底层行为。
背景速读
- 本文出自 Raymond Chen 的《The Old New Thing》博客。Raymond Chen 是微软资深工程师,长期撰写 Windows 底层机制与 API 行为分析,是 Windows 开发社区公认的权威。
- "DLL 明明没有被正式卸载,却从内存中消失了"——这类问题通常与 Windows 的延迟卸载(Delayed Unload)、进程环境变化或调试器干扰有关。
- 理解此文需要基础背景:Windows 中 DLL 通过引用计数管理加载/卸载,记录已加载 DLL 的链表(LDR_DATA_TABLE_ENTRY)由进程的 PEB(进程环境块)维护。
- 常见原因包括:进程在 DLL 加载过程中 crash 导致链表未完全更新;调试器或工具(如 Process Explorer)的查询行为意外触发卸载;系统在极端内存压力下强制回收某些库。
- 这篇博客的价值在于揭示 Windows 加载器并非绝对可靠,开发者不应假设程序在任意时刻看到的模块列表与操作系统内部状态完全一致。