2

かなり古いバージョンの 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だけのものなのか、私にはわかりません。それは何であり、どうすればこれをデバッグできますか?

4

1 に答える 1

4

Mats Petersson が正しく述べたように、 astd::stringから aを構築しようとしconst char *ていNULLます。

これが古い GCC では発生せず、新しい GCC で発生している可能性が高い理由は、GCC-4.7 が使用を停止し、使用.ctorsを開始したことです.init_arrayhttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770を参照してください。

Mats Petersson もおそらく正しく推測しているように、別々のコンパイル ユニット間の初期化子の順序に依存しており、この順序が変更された (順序が定義されていない) ため、代償を払っています。

100 以上の MLOC のコードベースでこの正確な問題が発生しました。解決策は、GCC を再構成することですconfigure --disable-initfini-array ...(独自の GCC リリースを構築します)。

一部のプラットフォーム ( などARM) は をサポートせず.ctors、 のみをサポートすることに注意してください.init_array

于 2013-08-02T04:33:32.637 に答える