Dynamic atexit destructor for xxx
一般遇到这个 call stack
很可能是全局变量析构函数中有依赖导致的。这个 call stack 会很短(因为有可能是任何情况导致程序退出),直接分析可能找不出原因。
至于全局变量的析构顺序,c++中没有明确定义,一般各个编译器实现为:根据构造的顺序逆向析构。
但是全局变量的构造又是很难控制的,以为各个全局变量会分布在不同的cpp文件中(编译单元)。
所以最好不要在全局变量的析构函数中做任何的清除工作,也不要让全局变量的析构函数之间有任何相互调用或依赖!
在程序第一次调用 LoadLibrary
和 LoadLibraryEx
的时候,该 dll 模块数据和代码都会被映射到进程的虚拟地址空间,并且该 dll 引用计数会加一. 如果该程序再次调用 LoadLibrary or
和 LoadLibraryEx
的时候,只会增加引用计数。
当一个 dll 被解除映射(DLL_PROCESS_DETACH
)或者 unload 的时候,在该dll中定义的全局变量会被析构。这个析构函数的就是通过 Dynamic Registerd atexit
这个回调函数调用的。
所以,当碰到这个问题的时候,有可能是 dll 被 unload 了,而导致 dll 被 unload 有可能是程序的异常退出。
因此,这种情况很有可能是异常导致 dll 被 detach,从而导致全局变量被析构。
这个时候需要打开 Visual Studio
的 Exception Settings
, 把异常断点打上,捕捉到异常抛出的代码段。