2016-12-05 8 views
0

Недавно я обновил свой ПК Gentoo Linux с помощью GCC 5.4.0.cppunit throws std :: bad_alloc после обновления gcc до 5.4.0

Я также перекомпилировал все пакеты в зависимости от gcc (он упоминался в gcc руководстве по обновлению для gentoo).

Большинство программ работает хорошо, однако мои тесты, используя cppunit, бросают std :: bad_alloc перед запуском.

Сначала я подумал, что может возникнуть проблема с обновленной версией cppunit, поэтому я понизил ее до предыдущей версии, но проблема все еще существует.

Всякий раз, когда я начинаю любой тест, приложение сразу же бросает:

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 

Я начал приложение в GDB и распечатанные отладки трассировки:

#0 0x00007ffff545d218 in raise() from /lib64/libc.so.6 
#1 0x00007ffff545e69a in abort() from /lib64/libc.so.6 
#2 0x00007ffff5d8f18d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#3 0x00007ffff5d8d046 in ??() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#4 0x00007ffff5d8d091 in std::terminate()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#5 0x00007ffff5d8d297 in __cxa_throw() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#6 0x00007ffff5db5f52 in std::__throw_bad_alloc()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#7 0x0000000000b2b3ae in __gnu_cxx::new_allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocate 
    (this=0x7fffffffda58, __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/ext/new_allocator.h:102 
#8 0x0000000000b2b1e2 in std::allocator_traits<std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::allocate (__a=..., __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/alloc_traits.h:491 
#9 0x0000000000b2b09e in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_allocate (this=0x7fffffffda58, 
    __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:170 
#10 0x0000000000b2af71 in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_create_storage (this=0x7fffffffda58, 
    __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:185 
#11 0x0000000000b2acf1 in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_Vector_base (this=0x7fffffffda58, 
    __n=18446741874689290911, __a=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:136 
#12 0x0000000000b29c9c in std::__cxx1998::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::vector (this=0x7fffffffda58, 
    __x=std::__cxx1998::vector of length -2199020260704, capacity -2199020259433 = {...}) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:320 
#13 0x0000000000b29449 in std::__debug::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::vector (this=0x7fffffffda40) 
    at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/debug/vector:193 
#14 0x0000000000b294ef in CppUnit::TestSuiteBuilderContextBase::TestSuiteBuilderContextBase (this=0x7fffffffda20) at /usr/include/cppunit/extensions/TestSuiteBuilderContext.h:29 
#15 0x0000000000b29515 in CppUnit::TestSuiteBuilderContext<Types_Decimal>::TestSuiteBuilderContext (this=0x7fffffffda20, contextBase=...) at /usr/include/cppunit/extensions/TestSuiteBuilderContext.h:106 
#16 0x0000000000b28a16 in Types_Decimal::addTestsToSuite (baseContext=...) at ./Tests/../../pCpp/CppUnitTests/Types_Decimal.hpp:10 
#17 0x0000000000b28caa in Types_Decimal::suite() at ./Tests/../../pCpp/CppUnitTests/Types_Decimal.hpp:12 
#18 0x0000000000b2871f in main() at Types_Decimal.cpp:8 

Там нет никаких проблем с самим тестовым файлом, так как Я не внес никаких изменений в это, и много тестов работало долгое время.

После того, как вы просмотрели трассировку стека, мне очень любопытно, что произошло на кадре # 12: __x=std::**__cxx1998**::vector of length **-2199020260704**, capacity **-2199020259433** = {...} Почему существует cxx1998? Как длина, так и мощность выглядят довольно безумными (неинициализированные?).

TestSuiteBuilderContext.h: 29:

void 
TestSuiteBuilderContextBase::addTest(Test *test) 
{ 
    m_suite.addTest(test); //line 29 
} 

TestSuite.cpp:

/// Adds a test to the suite. 
void 
TestSuite::addTest(Test *test) 
{ 
    m_tests.push_back(test); 
} 
+0

Поскольку вектор в значительной степени самоинициализируется и поддерживается, скорее всего, это плохое «это», или память была перезаписана действием разбиения стека или указателем-изгоем. – user4581301

ответ

0

я придумал частичное решение.

Похоже, вариант компиляции:

-D_GLIBCXX_DEBUG 

вызывает проблемы. После его удаления - тесты выполняются успешно.

+0

Итак, есть два объяснения вашей проблемы. -D_GLIBCXX_DEBUG несовместим с кодом, который не скомпилирован с ним, поскольку он обменивает стандартную библиотеку с версией отладки. Если весь ваш код был скомпилирован с -D_GLIBCXX_DEBUG (включая все библиотеки C++, на которые вы ссылаетесь), удаление этого параметра, скорее всего, скроет проблему. В библиотеке debug есть много дополнительных и полезных проверок, которые помогают найти проблемы. – moggi

+0

Сам cppunit был скомпилирован как системный пакет, поэтому, скорее всего, без отладочной версии stl. – peku33

 Смежные вопросы

  • Нет связанных вопросов^_^