У меня есть программа, в которой я использую cout для извлечения информации об отладке. Код выполняется при инициализации статической глобальной переменной, то есть в самом начале выполнения программы. Когда я использую собственную сборку script для сборки программы, она segfaults при первом использовании cout (только строковый литерал смещается в cout, поэтому он не может быть значением). Я использовал valgrind для проверки более ранних записей в недопустимых местах, но их нет (и нет также кода, который, вероятно, сгенерировал бы эти записи, я не делаю слишком много до выхода). Когда я копирую исходный код в проект eclipse и позволяю встроенному построителю eclipse строить его, тогда все работает нормально. Я не использовал никаких странных настроек компоновщика, просто скомпилированных с помощью -ggdb -std=c++0x
, это только два флага.
И что может быть причиной того, что cout с строковым литералом segfaults, если раньше не было недопустимых записей? Как это может повлиять на конфигурацию сборки?
(Мне жаль, что я не могу дать вам минимальный пример, так как этот пример будет просто компилироваться на вашем компьютере, как это делается для меня при использовании построителя 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";