cout を使用してデバッグ情報を出力するプログラムがあります。コードは、静的グローバル変数の初期化、つまりプログラム実行のかなり早い段階で実行されます。独自のビルド スクリプトを使用してプログラムをビルドすると、最初に cout を使用したときに segfault が発生します (文字列リテラルのみが cout にシフトされるため、値にすることはできません)。valgrind を使用して、無効な場所への以前の書き込みをチェックしましたが、何もありません (また、それらの書き込みを生成する可能性のあるコードもありません。出力の前にあまり多くのことを行いません)。ソース コードを Eclipse プロジェクトにコピーし、Eclipse 組み込みビルダーでビルドすると、すべて正常に動作します。でコンパイルされた奇妙なビルダー設定は使用しませんでした-ggdb -std=c++0x
。これらは 2 つのフラグのみです。
では、以前に無効な書き込みがなかった場合、文字列リテラルを含む cout が segfault になる理由は何でしょうか? ビルド構成はこれにどのように影響しますか?
(この例は、eclipse ビルダーを使用している場合と同様に、マシンで正常にコンパイルされるため、最小限の例を提供できず申し訳ありません)
編集:スタックトレースは次のとおりです。
0x00007ffff7b6d7d1 in std::ostream::sentry::sentry(std::ostream&) () from /usr/lib /x86_64-linux-gnu/libstdc++.so.6
(gdb) backtrace
#0 0x00007ffff7b6d7d1 in std::ostream::sentry::sentry(std::ostream&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00007ffff7b6dee9 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00007ffff7b6e2ef in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00000000004021be inTest::fill (this=0x6120f8, funcs=...) at inTest.cpp:92
最後のフレームは私のコードです。92行目は次のように単純に書かれています:
std::cout << "Test";