logging-log4cxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Curt Arnold <carn...@apache.org>
Subject Re: SIGSEGV on ~RollingFileAppender
Date Sat, 08 Mar 2008 18:15:01 GMT

On Mar 4, 2008, at 1:57 PM, Kiyoshi Mizumaru wrote:

> I'm trying to narrowing down my problem and find that the following  
> code
> crashes with signal 11, but eliminating the `//' on the sixth line  
> make it run
> without any problem.  Could anyone please give me a clue?
>
> --kiyoshi
>
>
> #include <log4cxx/logger.h>
> #include <log4cxx/basicconfigurator.h>
> #include <log4cxx/propertyconfigurator.h>
> #include <iostream>
>
> // static log4cxx::LoggerPtr s_message =  
> log4cxx::Logger::getLogger("root");
>
> class baz {
> public:
>    ~baz() {
>        std::cout << "baz::~baz()" << std::endl;
>        LOG4CXX_FATAL(log4cxx::Logger::getLogger("root"), "~baz()");
>    }
> } s_baz;
>
> int main(int, char**) {
>    log4cxx::BasicConfigurator::configure();
>    return EXIT_SUCCESS;
> }
>


You are getting bit by destruction order of static objects.  The first  
log4cxx call will create a local static member that initializes APR.   
On program end, static objects are then destroyed in the reverse order  
of creation.  As the program stands, the sequence is:

baz::baz()
enter main
log4cxx::BasicConfigurator::configure() -> triggers APR initialization
exit main
APR termination
baz::~baz() -> calls log4cxx but APR has been terminated

If you uncomment the line, then:

s_message construction -> triggers APR initialization
baz::baz()
enter main
log4cxx::BasicConfigurator::configure()
exit main
baz::~baz()
APR termination

Anytime you perform logging in the destructor of a static object, you  
need to ensure that log4cxx is initialized in or before the initial  
construction of the static object.

Mime
View raw message