为什么在使用gcc 4.7进行编译时会出现此堆栈跟踪,而不是使用较早的4.3之前的堆栈跟踪?

时间:2013-08-01 23:27:28

标签: c++ gcc gdb gcc4.7

我有一个相当大的二进制文件,我在一个相当旧版本的GCC(4.1.2)上构建了一段时间。我最近用4.7构建了它,但是当我运行它时它崩溃了以下的回溯:

terminate called after throwing an instance of 'std::logic_error'
  what(): basic_string::_S_construct NULL not valid

Program received signal SIGABRT, Aborted.
0x000003728472c5 in raise() from /lib64/libc.so.6
(gdb) bt
#0 0xbla in raise () from /lib64/libc.so.6
#1 0xbla in abort() from /lib64/libc.so.6
#2 0xbla in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6
#3 0xbla in ?? () from /usr/lib64/libstdc++.so.6
#4 0xbla in std::terminate() () from /usr/lib64/libstdc++.so.6
#5 0xbla in __cxa_throw () from /usr/lib64/libstdc++.so.6
#6 0xbla in std::__throw_logic_error(char const*) () from /usr/lib64/libstdc++.so.6
#7 0x00000024727472 in ?? () from /usr/lib64/libstdc++.so.6
#8 0xbla in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib64/libdstdc++.so.6
#9 0xbla in CFGS_XML_Parser::ns_name (name=0x12283c0 "name") at CFGS_XML_Parser.H:258
#10 0xbla in __static_initialization_and_destruction_0 (__initialize_p=1,__priority=65535)
#11 0xbla in _GLOBAL__sub_I__Z15init_xml_loaderv () at CFGS_XML_Loader.C:728
#12 0xbla in __libc_csu_init()
#13 0xbla in __libc_start_main () from /lib64/libc.so.6
#14 0xbla in _start ()

我不知道这是抱怨什么,为什么它只是一个gcc 4.7。它可能是什么,我该如何调试呢?

1 个答案:

答案 0 :(得分:4)

正如Mats Petersson所说,你试图从std::string构建一个const char *,即NULL

GCC-4.7停止使用.ctors并开始使用.init_array,这可能是因为较旧的GCC并未发生这种情况。见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770

正如Mats Petersson也可能正确猜到的那样,你已经依赖于不同编译单元之间的初始化顺序,现在这个顺序发生了变化(订单未定义),你付出了代价。

我们在100+ MLOC的代码库中遇到了这个问题,我们的解决方案是使用configure --disable-initfini-array ...重新配置GCC(我们构建自己的GCC版本)。

请注意,某些平台(例如ARM)不支持.ctors,仅支持.init_array