
On Dec 11, 2012, at 9:09 AM, Robert Ramey <ramey@rrsd.com> wrote:
I've had trouble setting up GDB for this test. This would be my normal approach.
Ok - here's what I've found: Here's the crash: (mac os X, gcc library 4.2.1):
Breakpoint 1, 0x00007fff844e3558 in malloc_error_break () (gdb) bt #0 0x00007fff844e3558 in malloc_error_break () #1 0x00007fff844ec809 in szone_error () #2 0x00007fff844ed374 in small_free_list_remove_ptr () #3 0x00007fff844eb013 in szone_free_definite_size () #4 0x00007fff844e4898 in free () #5 0x00007fff821b597f in std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::_M_destroy_internal_buffer () #6 0x00007fff821b54eb in std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::close () #7 0x00007fff821b5440 in std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::~basic_filebuf () #8 0x00007fff821b753a in std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream () #9 0x00007fff821b74cf in std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream () #10 0x0000000100003552 in test_array<A> () at test_array.cpp:109 #11 0x0000000100001b11 in test_main () at test_array.cpp:117 #12 0x00000001000019e7 in main (argc=1, argv=0x7fff5fbff720) at test_tools.hpp:203
You can see that it's destructing a std::basic_ifstream. If I strip a bunch of stuff out of test_array.cpp, the crash doesn't happen.
{ T a_array1[9]; test_istream is(testfile, TEST_STREAM_FLAGS); BOOST_TRY { #if 0 test_iarchive ia(is, TEST_ARCHIVE_FLAGS); bool exception_invoked = false; BOOST_TRY { ia >> boost::serialization::make_nvp("a_array", a_array1); } BOOST_CATCH (boost::archive::archive_exception ae){ BOOST_CHECK( boost::archive::archive_exception::array_size_too_short == ae.code ); exception_invoked = true; } BOOST_CATCH_END BOOST_CHECK(exception_invoked); #endif } BOOST_CATCH (boost::archive::archive_exception ae){} BOOST_CATCH_END }
If I include the line:
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
then it does. This suggests to me that something in the test_iarchive is poking at the test_istream - but I don't know what. I tried to extract this into a simple test case (attached), but I can't figure out what to link against for the wide case. clang++ junk.cpp -DNARROW -I /Sources/boost/trunk -L $BUILD/libs/serialization/$TAIL -lboost_serialization # works clang++ junk.cpp -I /Sources/boost/trunk -L $BUILD/libs/serialization/$TAIL -lboost_wserialization # does not For the narrow case, I link against lib boost_serialization, and everything is good. For the wide case, when I link against boost_wserialization, I get the following errors:
Undefined symbols for architecture x86_64: "boost::archive::archive_exception::archive_exception(boost::archive::archive_exception::exception_code, char const*, char const*)", referenced from: boost::archive::basic_binary_iprimitive<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::load_binary(void*, unsigned long) in junk-Sgu7RU.o "boost::archive::archive_exception::~archive_exception()", referenced from: _main in junk-Sgu7RU.o boost::archive::basic_binary_iprimitive<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::load_binary(void*, unsigned long) in junk-Sgu7RU.o void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&) in junk-Sgu7RU.o "boost::archive::basic_binary_iarchive<boost::archive::binary_wiarchive>::load_override(boost::archive::class_name_type&, int)", referenced from: void boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::load_override<boost::archive::class_name_type>(boost::archive::class_name_type&, int) in junk-Sgu7RU.o "boost::archive::basic_binary_iarchive<boost::archive::binary_wiarchive>::init()", referenced from: boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::init(unsigned int) in junk-Sgu7RU.o "boost::archive::basic_binary_iprimitive<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::init()", referenced from: boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::init(unsigned int) in junk-Sgu7RU.o "boost::archive::basic_binary_iprimitive<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::basic_binary_iprimitive(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >&, bool)", referenced from: boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::binary_iarchive_impl(std::basic_istream<wchar_t, std::char_traits<wchar_t> >&, unsigned int) in junk-Sgu7RU.o "boost::archive::basic_binary_iprimitive<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::~basic_binary_iprimitive()", referenced from: boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::~binary_iarchive_impl() in junk-Sgu7RU.o boost::archive::binary_iarchive_impl<boost::archive::binary_wiarchive, wchar_t, std::char_traits<wchar_t> >::binary_iarchive_impl(std::basic_istream<wchar_t, std::char_traits<wchar_t> >&, unsigned int) in junk-Sgu7RU.o "boost::archive::detail::basic_iarchive::basic_iarchive(unsigned int)", referenced from: boost::archive::detail::common_iarchive<boost::archive::binary_wiarchive>::common_iarchive(unsigned int) in junk-Sgu7RU.o "boost::archive::detail::basic_iarchive::~basic_iarchive()", referenced from: boost::archive::detail::common_iarchive<boost::archive::binary_wiarchive>::~common_iarchive() in junk-Sgu7RU.o boost::archive::detail::common_iarchive<boost::archive::binary_wiarchive>::common_iarchive(unsigned int) in junk-Sgu7RU.o "boost::archive::detail::basic_iarchive::get_library_version() const", referenced from: boost::archive::basic_binary_iarchive<boost::archive::binary_wiarchive>::load_override(boost::archive::tracking_type&, int) in junk-Sgu7RU.o boost::archive::basic_binary_iarchive<boost::archive::binary_wiarchive>::load_override(boost::archive::class_id_type&, int) in junk-Sgu7RU.o boost::archive::basic_binary_iarchive<boost::archive::binary_wiarchive>::load_override(boost::archive::version_type&, int) in junk-Sgu7RU.o "typeinfo for boost::archive::archive_exception", referenced from: GCC_except_table1 in junk-Sgu7RU.o void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&) in junk-Sgu7RU.o "typeinfo for boost::archive::detail::basic_iarchive", referenced from: typeinfo for boost::archive::detail::common_iarchive<boost::archive::binary_wiarchive> in junk-Sgu7RU.o "vtable for boost::archive::archive_exception", referenced from: boost::archive::archive_exception::archive_exception(boost::archive::archive_exception const&) in junk-Sgu7RU.o NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. ld: symbol(s) not found for architecture x86_64
Can you tell me how to solve this? -- Marshall Marshall Clow Idio Software <mailto:mclow.lists@gmail.com> A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait). -- Yu Suzuki