如何调试静态初始化问题?

How to debug static initialization problems?

我很难调试这个问题:https://github.com/cnjinhao/nana/issues/445

我有 并编辑了库的代码来实现 Meyer 的单例,以便正确的初始化顺序发生。 Hello worlds 仍然崩溃,尽管库的函数大部分已从堆栈跟踪中消失:

#include <nana/paint/graphics.hpp>
int main()
{
    nana::paint::font f;
}
Thread 1 received signal SIGSEGV, Segmentation fault.
(gdb) bt
#0  0x00000000004985cf in std::type_info::operator==(std::type_info const&) const ()
#1  0x0000000000455180 in __cxxabiv1::__vmi_class_type_info::__do_dyncast(long long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1::__class_type_info const*, void const*, __cxxabiv1::__class_type_info const*, void const*, __cxxabiv1::__class_type_info::__dyncast_result&) const ()
#2  0x00000000004eae07 in __dynamic_cast ()
#3  0x00000000004e6625 in bool std::has_facet<std::ctype<char> >(std::locale const&) ()
#4  0x00000000004e1f74 in std::basic_ios<char, std::char_traits<char> >::_M_cache_locale(std::locale const&) ()
#5  0x00000000004e20c0 in std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ()
#6  0x00000000004dfe2b in std::ios_base::Init::Init() ()
#7  0x0000000000431f2f in __static_initialization_and_destruction_0(int, int) [clone .lto_priv.4] ()
#8  0x0000000000431f59 in _GLOBAL__sub_I__ZN4nana6detail18drawable_impl_typeC2Ev ()
#9  0x00000000004398c9 in global constructors keyed to 65535_0_objects.a_0x8e.19316 ()
#10 0x00000000004432b3 in __do_global_ctors ()
    at E:/GitHub/MINGW-packages/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/gccmain.c:67
#11 0x00000000004432fb in __main ()
    at E:/GitHub/MINGW-packages/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/gccmain.c:83
#12 0x000000000040131c in __tmainCRTStartup ()
    at E:/GitHub/MINGW-packages/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:329
#13 0x00000000004014c9 in mainCRTStartup ()
    at E:/GitHub/MINGW-packages/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:223

使用 -O0 -g -fno-omit-frame-pointer -fno-inline -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS -fasynchronous-unwind-tables -fstack-clash-protection 进行编译导致堆栈跟踪稍长一些,但仍然没有可搜索的内容。

即使我用无缓冲的调试打印填充库,屏幕上也没有任何显示 - 程序似乎在构建第一个全局对象之前就崩溃了。我使用了 strace(来自 Git Bash)并验证了可执行文件加载了所有正确的共享库。

我正在寻找任何可以帮助我调试问题的东西。不幸的是,这是一个仅 Windows 的崩溃,所以 运行 使用 uftrace 或消毒剂是不可能的。使用 GCC 8.3.1.

崩溃的原因是 nana 库在其 CMake 文件中有 -static-libgcc -static-libstdc++ 作为 public 依赖项。可执行文件和所有其他库都动态链接了它们。令人惊讶的是,没有符号冲突,但可执行文件中的标准库代码已损坏。

通过从 nana 的 CMake 文件中删除这些标志来解决。