内存中未正式卸载却消失不见的DLL之谜,第二部
本文是系列的第二部分,探讨一个看似矛盾的案例:某个DLL并未被正式卸载,却从内存中消失。作者通过串联两个不同的bug,解释了这一异常现象的根本原因。
背景速读
- Raymond Chen 是微软资深开发者,长期撰写《The Old New Thing》博客,专门讲解 Windows 底层机制和调试中遇到的诡异 bug。这篇文章是系列第二篇,延续了上一篇未讲完的 DLL 丢失谜题。
- 核心场景:一个 DLL(动态链接库)在 Windows 进程中没有被正式卸载(没有调用 FreeLibrary),却从内存中消失了。作者通过两条独立 bug 线索的交汇来解释这个看似不可能的现象。
- 需要的基础知识:Windows 中 DLL 通过引用计数管理加载/卸载;FreeLibrary 会减少计数,计数到零才真正卸载;但某些系统组件(如内核态驱动、DLL 的入口点代码)绕过常规路径,导致计数状态混乱。
- 这篇帖子面向的是 Windows 系统程序员和调试工程师,普通读者需要了解“引用计数”“进程地址空间”“DLL 入口点”等概念。