Grundsätzliche Probleme mit boost::log



  • Hallo,

    hab gestern begonnen, boost::log zu verwenden, da deren Features sehr vielversprechend sind und sie genau meine Anforderungen zu erfüllen scheint. Habe dann allerdings den halben Tag damit verbracht, ein eigentlich triviales Beispiel zu implementieren. Nachdem ich's mit Ach und Krach, viel google und trial'n'error einigermaßen hin bekommen hab, fiel mir auf, dass ich Probleme in meinem atexit Callback habe. Wenn ich dort logge, crasht meine Applikation. Kurzes Reindebuggen zeigte, dass manche Objekte (z.B. core) schon freigegeben sind. Wenn ich von dort aus Objekte aufräume, können die in weiterer Folge also auch nicht mehr loggen, was eine große Einschränkung ist. Jetzt steh ich komplett an. Hier ist mein Code (boost.log ist eine static lib, Compiler ist MSVC 2010):

    Deklaration einiger globaler pointer... ich hab erst versucht, per BOOST_LOG_DECLARE_GLOBAL_LOGGER_CTOR_ARGS einen globalen Logger zu definieren, nachdem ich aber den Eindruck hatte, dass ich aufgrund von oben genanntem Problem mehr Kontrolle über den Zeitpunkt der Objektfreigabe benötige, habe ich mich vorerst mal für globale shared_ptr entschieden.

    using namespace boost::log::trivial;
    
    #ifdef _DEBUG
    boost::shared_ptr<boost::log::sources::severity_logger<severity_level> >	peekLogger( new boost::log::sources::severity_logger<severity_level>( debug ) );
    #else
    boost::log::sources::severity_logger<severity_level>	peekLogger( warning );
    #endif
    boost::shared_ptr<boost::log::core> core;
    
    #define LOG( level )	BOOST_LOG_SEV( *peekLogger, level )
    

    Initialisierungscode:

    static void initLogging()
    {
    	core = boost::log::core::get();
    
    	core->add_global_attribute( "TimeStamp", boost::make_shared<boost::log::attributes::local_clock>() );
    
    	boost::shared_ptr<boost::log::sinks::text_ostream_backend> consoleBackend = boost::make_shared<boost::log::sinks::text_ostream_backend>();
    	consoleBackend->add_stream( boost::shared_ptr<std::ostream>( &std::cout, boost::log::empty_deleter() ) );
    	consoleBackend->auto_flush( true );
    
    	typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend> ConsoleSink;
    	boost::shared_ptr<ConsoleSink> consoleSink( new ConsoleSink( consoleBackend ) );
    #ifdef NDEBUG
    	consoleSink->set_filter( boost::log::filters::attr<int>( "Severity" ) >= warning );
    #endif
    	consoleSink->locked_backend()->set_formatter( 
    			boost::log::formatters::stream 
    				<< "<" << boost::log::formatters::attr<severity_level>( "Severity" ) << "> " 
    				<< boost::log::formatters::message()
    		);
    
    	boost::shared_ptr<boost::log::sinks::text_file_backend> fileBackend = boost::make_shared<boost::log::sinks::text_file_backend>(
    			boost::log::keywords::file_name = toLogPath( "renderer_%Y-%m-%d_%H-%M-%S.log" ),
    			boost::log::keywords::rotation_size = 50 * 1024 * 1024,
    			boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point( 12, 0, 0 )
    		);
    	// Enable auto-flushing after each log record written
    	fileBackend->auto_flush( true );
    
    	typedef boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend> FileSink;
    	boost::shared_ptr<FileSink> fileSink( new FileSink( fileBackend ) );
    	fileSink->locked_backend()->set_formatter( 
    			boost::log::formatters::stream 
    				<< boost::log::formatters::date_time<boost::posix_time::ptime>( "TimeStamp" ) << ": "
    				<< "<" << boost::log::formatters::attr<severity_level>( "Severity", std::nothrow ) << "> " 
    				<< boost::log::formatters::message()
    		);
    	core->add_sink( consoleSink );
    	core->add_sink( fileSink );
    }
    

    Und hier crasht dann das Programm:

    void __cdecl onExit()
    {
    	LOG( trace ) << "on exit called"; //boom
    
    	cleanup();
    }
    
    //...
    
    int main( int argc, char **argv )
    {
    	atexit( onExit );
    
    	//....
    }
    

    Genau genommen crasht es in Zeile 439 in core.cpp ("if (it->get()->try_consume(rec))"), in basic_core< CharT >::push_record. ("Windows has triggered a breakpoint in Renderer_d.exe. This may be due to a corruption of the heap, which indicates blablabla...")

    Hat jemand eine Idee, was ich dagegen machen könnte? Danke!


Anmelden zum Antworten