Boost test boost中的SIGSEGV::单元测试::输出::编译器\u日志\u格式化程序开始和完成 boost::unit_test::output::compiler_log_formatter::log_start()调用ostream::_M_insert()

Boost test boost中的SIGSEGV::单元测试::输出::编译器\u日志\u格式化程序开始和完成 boost::unit_test::output::compiler_log_formatter::log_start()调用ostream::_M_insert(),boost-test,Boost Test,大家好 我试图编译一个使用Boost.Test模块的代码,在处理一些参数时,它似乎已经损坏了:每当我运行代码时,在日志文件第一行的打印输出处,我都会遇到一个分段错误。自定义命名日志文件存在,但为空,并且不会发出错误消息 我的设置是使用下面的代码完成的,之后BOOST_GLOBAL_FIXTURE被初始化(成功)。如果我理解堆栈跟踪,那么错误似乎只有在开始遍历测试单元树时才会发生 我在boost TRAC上打开了一张罚单,但它甚至还没有被分配 我运行的是CentOS 6.5,所以我的boost版本

大家好

我试图编译一个使用Boost.Test模块的代码,在处理一些参数时,它似乎已经损坏了:每当我运行代码时,在日志文件第一行的打印输出处,我都会遇到一个分段错误。自定义命名日志文件存在,但为空,并且不会发出错误消息

我的设置是使用下面的代码完成的,之后BOOST_GLOBAL_FIXTURE被初始化(成功)。如果我理解堆栈跟踪,那么错误似乎只有在开始遍历测试单元树时才会发生

我在boost TRAC上打开了一张罚单,但它甚至还没有被分配

我运行的是CentOS 6.5,所以我的boost版本是1.41

堆栈跟踪 取自第四个堆栈帧(作为参数传递给第三个帧)

由BOOST_GLOBAL_夹具加载
在获得每个测试单元的打印输出后,无需解释。摘要没有打印到文件中。

在没有得到任何帮助和一些绝望的摆弄之后,它似乎起了作用。我不知道怎么做

原始问题的可能原因:

  • 流对象无效(例如,double open()等)。谢谢@sehe@.
  • 在init_unit_TEST_suite()内的BOOST_全局_FIXTURE中调用BOOST_TEST宏

  • 小溪可以吗?是否及时为记录器初始化?您可以在调试器中查看这些值,然后只需/check/what's off-what-what-what-off-what-what-what-what-off-whack。这可能会告诉你出了什么问题。否则,它可能会给其他人一个机会clue@sehe谢谢,我会这么做,让你们大家know@sehe不走运。请参阅调试信息
        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   
    
    std::ostream & unit_test_log_t::test_start::s_log_impl().stream() = @0x7fffffffc9a0
    
    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;
    };
    
    compiler_log_formatter::log_finish( std::ostream& ostr )
    {
        ostr.flush();
    }