尽管未正式卸载,但在内存中却找不到的DLL
本文探讨了一个令人困惑的调试场景:一个DLL虽然从未被正式卸载,却从进程的内存空间中神秘消失。文章分析了导致该问题的可能原因,包括隐式加载机制、引用计数异常以及操作系统的内存管理行为,帮助开发者理解这类罕见但棘手的故障现象。
背景速读
这篇文章来自微软资深工程师 Raymond Chen 的博客《The Old New Thing》,专门讲述 Windows 平台上的奇闻轶事和底层细节。
- **Raymond Chen**:微软长期员工,Windows 团队核心成员,以深入浅出地解释 Windows 内部机制、API 行为和历史遗留问题而闻名。
- **背景知识**:在 Windows 中,DLL(动态链接库)被加载到进程的地址空间后,通常有一个引用计数机制;当所有使用者都释放后,DLL 会被卸载。但实际工程中情况远比理论复杂。
- **本文核心问题**:程序员发现一个 DLL 虽然从未被显式卸载,却“不翼而飞”——进程认为它不再存在于内存中。Chen 解释了这背后的 Windows 加载器行为,涉及 DLL 的延迟加载(delay-load)、静态链接与动态加载的交互,以及某些情况下系统如何“静默”卸载 DLL,导致调试时出现令人困惑的状态。