Opened 8 years ago
Closed 7 years ago
#10943 closed Bugs (invalid)
SIGSEGV in compiler_log_formatter::log_start
| Reported by: | Owned by: | Gennadiy Rozental | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | test |
| Version: | Boost 1.41.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
SIGSEGV in output::compiler_log_formatter::log_start() call to ostream::_M_insert<unsigned long>()
Hi!
I'm trying to compile a code which uses the Boost.Test module, and while playing around with some of the parameters it seems to have broken: I now get a segmentation fault whenever I run the code, at the printout of the first line to the log file. The custom-named log file exists, but is empty, and no error message is emitted.
My setup is done using the following code, after which a BOOST_GLOBAL_FIXTURE is initiallized (succesfully). If I understand the stack trace, the error seems to occur only when starting to traverse the test_unit tree.
Stack trace:
Thread [1] 5624 [core: 6] (Suspended : Signal : SIGSEGV:Segmentation fault)
std::ostream::sentry::sentry() at 0x3495a915b1
std::ostream& std::ostream::_M_insert<unsigned long>() at 0x3495a95168
boost::unit_test::output::compiler_log_formatter::log_start() at compiler_log_formatter.ipp:50 0x45aaa3
boost::unit_test::unit_test_log_t::test_start() at unit_test_log.ipp:138 0x469ad5
boost::unit_test::ut_detail::test_start_caller::operator() at framework.ipp:71 0x489832
boost::unit_test::ut_detail::invoker<int>::invoke<boost::unit_test::ut_detail::test_start_caller>() at callback.hpp:42 0x4de998
boost::unit_test::ut_detail::callback0_impl_t<int, boost::unit_test::ut_detail::test_start_caller>::invoke() at callback.hpp:89 0x4db5a7
boost::unit_test::callback0<int>::operator() at callback.hpp:118 0x4a24ff
boost::detail::do_invoke<boost::scoped_ptr<boost::detail::translate_exception_base>, boost::unit_test::callback0<int> >() at execution_monitor.ipp:244 0x497784
boost::execution_monitor::catch_signals() at execution_monitor.ipp:841 0x461918
boost::execution_monitor::execute() at execution_monitor.ipp:1,167 0x4619dc
boost::unit_test::framework::run() at framework.ipp:418 0x45dc32
boost::unit_test::unit_test_main() at unit_test_main.ipp:185 0x46a85e
main() at unit_test_main.ipp:237 0x46aa58
Loaded by the BOOST_GLOBAL_FIXTURE
static const bool TestingDefs::formatBoostTestForJenkins = false; /// Loaded by the BOOST_GLOBAL_FIXTURE struct BoostTestFlags { BoostTestFlags() : m_set(false) { Func_Reporter; if (!m_set) m_set = set(); } bool set() { m_sOFStreamDirName = GlobalLoggerSingleton::instance()->getFullFilePath(); m_sOFStreamFileName = m_sOFStreamDirName + string("/") + string("BoostTests_") + to_iso_string(second_clock::local_time()); m_sOFStreamFileName += "."; ///< add filename extension according to filetype, TBD later on. BETIS_LOGMSG((LM_INFO,"Boost.Test output will be written to %s",m_sOFStreamFileName.c_str())); if (TestingDefs::formatBoostTestForJenkins) { m_sOFStreamFileName += "xml"; m_oFStreamBoostTests.open(m_sOFStreamFileName.c_str(), std::ofstream::out | std::ofstream::trunc); if (!m_oFStreamBoostTests.is_open()) { BETIS_LOGMSG((LM_ERROR,"BoostTestFlags::BoostTestFlags() Could not open output file stream for writing!")); return false; } boost::unit_test::unit_test_log.set_stream(m_oFStreamBoostTests); boost::unit_test::unit_test_log.set_format((boost::unit_test::output_format) XML); ///< --output_format=XML boost::unit_test::unit_test_log.set_threshold_level((boost::unit_test::log_level) 0); ///< --log_level=all boost::unit_test::results_reporter::set_level(boost::unit_test::report_level(NO_REPORT)); ///< --report_level=no boost::unit_test::results_reporter::set_format((boost::unit_test::output_format) XML); } else ///< Flags for human readability, verbose { m_sOFStreamFileName += "log"; m_oFStreamBoostTests.open(m_sOFStreamFileName.c_str(), std::ofstream::out | std::ofstream::trunc); if (!m_oFStreamBoostTests.is_open()) { BETIS_LOGMSG((LM_ERROR,"BoostTestFlags::BoostTestFlags() Could not open output file stream for writing!")); return false; } boost::unit_test::unit_test_log.set_stream(m_oFStreamBoostTests); boost::unit_test::unit_test_log.set_format((boost::unit_test::output_format) CLF); ///< Compiler Log Format boost::unit_test::unit_test_log.set_threshold_level((boost::unit_test::log_level) 0); boost::unit_test::results_reporter::set_level(boost::unit_test::report_level(DETAILED_REPORT)); boost::unit_test::results_reporter::set_format((boost::unit_test::output_format) CLF); cout.setf(ios_base::unitbuf); ///< Turn off STDOUT buffering to improve accuracy of communication between Boost.Test and Tests Runner (since Boost.Test does not provide a way to flush the stream). @warning This costs in execution time. @see github.com/xgsa/cdt-tests-runner/wiki/Features#known-problems } return true; } ~BoostTestFlags() { Func_Reporter; } private: ofstream m_oFStreamBoostTests; string m_sOFStreamDirName; string m_sOFStreamFileName; bool m_set; };
Change History (6)
comment:1 by , 8 years ago
| Severity: | Problem → Cosmetic |
|---|---|
| Type: | Support Requests → Bugs |
comment:2 by , 8 years ago
| Severity: | Cosmetic → Problem |
|---|
likewise, I get a segmentation fault in
compiler_log_formatter::log_finish( std::ostream& ostr )
{
ostr.flush();
}
with no explanation, after getting printouts from each of the test_units. The summary isn't printed to file.
comment:5 by , 7 years ago
Sorry, guys, no I can't because I've left the company where I wrote the code...

http://stackoverflow.com/a/28049426/3368225
After getting no help, and some desperate fiddling around, it seems to be working. I'm not sure how.
Possible reasons for the original problem:
More informative output really should be given. For example, check the ofstream once before trying to insert into it, and maybe some more advanced sanity check to make sure any BOOST_TEST macro called prematurely is at least warned about.