有一个隐式加载某些 DLL 和其他显式 (LoadLibrary) 的 EXE。这个EXE正在执行它的ExitProcess(剩下的进程中的1个线程),并且作为忙于卸载DLL的一部分,比如A.DLL。
A.DLL(不幸的是)有一个静态的。调用 atexit 回调并开始调用此静态的析构函数,留下一系列析构函数,直到析构函数决定进行一些清理并加载 DLL 来执行此操作。此 DLL 执行某些方法,直到由于内存访问冲突而发生崩溃,因为它要在此 DLL 中使用的静态不再存在。查看此静态的堆栈跟踪,它的析构函数已作为其 DLL 卸载的一部分被调用。
发生了什么?DLL 被加载,执行了一些方法,去使用一个静态的(在同一个 DLL 中),但这已经被破坏了(静态只有在 dll 被卸载时被破坏)。那么它是否处于执行方法的半不确定状态但也正在被破坏?
EXE 似乎在 __tmainCRTStartup 的上下文中,这意味着用户创建的 main 已返回?在用户 main 或 tmainCRTStartup 的上下文中是否卸载了 DLL?