You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by "Xiong, Wei (Wei)" <wx...@lucent.com> on 2004/10/21 04:20:44 UTC

RE: Static initialization order (was Re: I degrade some softwares on my computer ...)

Thank you and Simon. But I tried the same program with the .so file built
from my own makefile (I just write a config_auto.h for it and compile every
.cpp file to .o and pack them together), it runs very well. And in my demo
program, I have include standard log4cxx  .h files before my definition of
Bar::logger. Will not the log4cxx global static be constructed before the
construction of Bar::logger?
Besides, in my simplified program, I am sure all the global static variables
have been constructed before I call any log4cxx function explicitly. But I
got the same output and crash info. I tried my old program (with a global
static 'LoggerPtr logger = Logger::getLogger(_T("MyApp"));') again, the
logger has a valid value.

(gdb) p logger
$1 = {p = 0x80630c8}
(gdb) p logger->p
$2 = (Logger *) 0x80630c8

And the crash info shows that the program just collapse when it is parsing
the configuration file. But I really don't know more about what the crash
info means.

// my simplified program

#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/xml/domconfigurator.h>
#include <log4cxx/helpers/loglog.h>

using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::xml;

class Bar
{
	log4cxx::LoggerPtr logger;

public:
	Bar();
	void doIt();
};

Bar::Bar()
{
	logger = Logger::getLogger(_T("MyApp"));
}

void Bar::doIt()
{
	logger->debug(_T("Did it again!"));
}


int main(int argc, char **argv)
{
	int result = EXIT_SUCCESS;

	try
	{
		DOMConfigurator::configure(argv[1]);
		
		Bar bar;
		bar.doIt();
	}
	catch(Exception&)
	{
		result = EXIT_FAILURE;
	}

	return result;
}

Regards,

Bill David
2004.10.21


-----Original Message-----
From: Curt Arnold [mailto:carnold@apache.org]
Sent: Thursday, October 21, 2004 8:24 AM
To: Log4CXX User
Subject: Static initialization order (was Re: I degrade some softwares on my
computer ...)


Thanks, the traceback is consistent with attempting to configure before 
the static string DEBUG_KEY has been constructed.  I've just completed 
a fairly wide-ranging patch that eliminates use of non-local static 
variables (see item 47 in Effective C++ for background) within log4cxx. 
    However, the bug database has been having problems for a couple of 
hours and so I can't get a bug number to use in the commit.  If it 
stays down another hour, I'll do the commit anyway.

The most commonly used non-local static variables are the 
log4cxx::Level::DEBUG and similar level "constants".  I could not 
remove those without breaking almost all code that uses log4cxx, so 
I've left them in but added accessors, log4cxx::Level::getDebug(), etc 
that are safe for use at any time and changed all references to 
log4cxx::Level::DEBUG inside log4cxx to use the accessor.

Re: Static initialization order (was Re: I degrade some softwares on my computer ...)

Posted by "Sven A. Schmidt" <sa...@abstracture.de>.
Bill,

there's nothing you can do influence the order of global static 
initialization. It can go wrong any time it pleases. I found that 
callig "doConfigure" (or similar) gets the initialization done (see my 
previous posts about two months ago).

HTH,
Sven

On 21.10.2004, at 04:20, Xiong, Wei (Wei) wrote:

> Thank you and Simon. But I tried the same program with the .so file 
> built
> from my own makefile (I just write a config_auto.h for it and compile 
> every
> .cpp file to .o and pack them together), it runs very well. And in my 
> demo
> program, I have include standard log4cxx  .h files before my 
> definition of
> Bar::logger. Will not the log4cxx global static be constructed before 
> the
> construction of Bar::logger?
> Besides, in my simplified program, I am sure all the global static 
> variables
> have been constructed before I call any log4cxx function explicitly. 
> But I
> got the same output and crash info. I tried my old program (with a 
> global
> static 'LoggerPtr logger = Logger::getLogger(_T("MyApp"));') again, the
> logger has a valid value.
>
> (gdb) p logger
> $1 = {p = 0x80630c8}
> (gdb) p logger->p
> $2 = (Logger *) 0x80630c8
>
> And the crash info shows that the program just collapse when it is 
> parsing
> the configuration file. But I really don't know more about what the 
> crash
> info means.
>
> // my simplified program
>
> #include <log4cxx/logger.h>
> #include <log4cxx/basicconfigurator.h>
> #include <log4cxx/helpers/exception.h>
> #include <log4cxx/propertyconfigurator.h>
> #include <log4cxx/xml/domconfigurator.h>
> #include <log4cxx/helpers/loglog.h>
>
> using namespace log4cxx;
> using namespace log4cxx::helpers;
> using namespace log4cxx::xml;
>
> class Bar
> {
> 	log4cxx::LoggerPtr logger;
>
> public:
> 	Bar();
> 	void doIt();
> };
>
> Bar::Bar()
> {
> 	logger = Logger::getLogger(_T("MyApp"));
> }
>
> void Bar::doIt()
> {
> 	logger->debug(_T("Did it again!"));
> }
>
>
> int main(int argc, char **argv)
> {
> 	int result = EXIT_SUCCESS;
>
> 	try
> 	{
> 		DOMConfigurator::configure(argv[1]);
> 		
> 		Bar bar;
> 		bar.doIt();
> 	}
> 	catch(Exception&)
> 	{
> 		result = EXIT_FAILURE;
> 	}
>
> 	return result;
> }
>
> Regards,
>
> Bill David
> 2004.10.21
>
>
> -----Original Message-----
> From: Curt Arnold [mailto:carnold@apache.org]
> Sent: Thursday, October 21, 2004 8:24 AM
> To: Log4CXX User
> Subject: Static initialization order (was Re: I degrade some softwares 
> on my
> computer ...)
>
>
> Thanks, the traceback is consistent with attempting to configure before
> the static string DEBUG_KEY has been constructed.  I've just completed
> a fairly wide-ranging patch that eliminates use of non-local static
> variables (see item 47 in Effective C++ for background) within log4cxx.
>     However, the bug database has been having problems for a couple of
> hours and so I can't get a bug number to use in the commit.  If it
> stays down another hour, I'll do the commit anyway.
>
> The most commonly used non-local static variables are the
> log4cxx::Level::DEBUG and similar level "constants".  I could not
> remove those without breaking almost all code that uses log4cxx, so
> I've left them in but added accessors, log4cxx::Level::getDebug(), etc
> that are safe for use at any time and changed all references to
> log4cxx::Level::DEBUG inside log4cxx to use the accessor.
>
>