有一个EXE文件,它隐式加载了一些DLL文件,同时也显式地(使用LoadLibrary)加载了其他一些DLL文件。这个EXE正在执行ExitProcess(进程中还剩下1个线程),并且在忙于卸载一个名为A.DLL的DLL时。
不幸的是,A.DLL具有静态内容。atexit回调被调用,这个静态的析构函数开始被调用,留下一连串的析构函数,直到某个析构函数决定进行一些清理工作并加载一个DLL来完成此操作。这个DLL执行一些方法,直到由于内存访问违规而崩溃,因为它即将使用的一个静态变量在此DLL中已不存在。查看这个静态变量的堆栈跟踪,发现它的析构函数已经作为DLL卸载的一部分被调用。
发生了什么?DLL被加载,执行了一些方法,然后要使用同一DLL中的一个静态变量,但是这个静态变量已经被销毁了(静态变量只有在DLL卸载时才会被销毁)。所以它处于一种半悬停状态,既在执行方法,又在被销毁。
这个EXE似乎处于__tmainCRTStartup上下文中,这意味着用户创建的main函数已经返回了?DLL在用户主函数或tmainCRTStartup上下文中卸载吗?
tmainCRTStartup
中,DLL 在 .exe 的全局析构函数完成后被关闭。 - avakar