About using 0.9.8 -- my company is a
bit reluctant (understandably) to use a version of a library that has not yet
been released, and is constantly being changed. As soon as the new version
is released, we plan to switch over to it.
Anyway, here are the details on the
crash I'm experiencing. I would certainly appreciate it if you could show
me how to prevent it:
In a function called before main(), Logger::getLogger() is called.
First, log4cxx produces this error
message:
"You have tried to set a null level to root."
This happens in rootcategory.cpp, line 40
It happens because we are trying to set a level using the static Level pointer Level::DEBUG.p, which is NULL.
It happens because we are trying to set a level using the static Level pointer Level::DEBUG.p, which is NULL.
Here is the stack trace at this
point:
log4cxx::spi::RootCategory::setLevel(const log4cxx::helpers::ObjectPtrT<log4cxx::Level> & {...}) line 40
log4cxx::spi::RootCategory::RootCategory(const log4cxx::helpers::ObjectPtrT<log4cxx::Level> & {...}, unsigned int 1) line 29
log4cxx::LogManager::getLoggerRepository() line 70 + 94 bytes
log4cxx::LogManager::getLogger(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d30b9 "TraceTst.BeforeMain"}) line 124 + 15 bytes
log4cxx::Logger::getLogger(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d30b9 "TraceTst.BeforeMain"}) line 473 + 13 bytes
BeforeMain() line 44 + 357 bytes
$E90() line 32 + 29 bytes
$E91() + 29 bytes
_initterm(void (void)* * 0x00716160 $S92, void (void)* * 0x00716a7c ___xc_z) line 525
_cinit() line 192 + 15 bytes
mainCRTStartup() line 205
KERNEL32! 7c816d4f()
Then, the application crashes with
the following message:
"Unhandled exception in TraceTst.exe: 0xC0000005: Access Violation."
This happens in class.cpp, line 79.
It happens because we are trying to dereference the global classMap pointer registry, which is NULL:
It happens because we are trying to dereference the global classMap pointer registry, which is NULL:
const Class * clazz = (*registry)[StringHelper::toLowerCase(strippedClassName)];
Here is the stack trace at the point
of the crash:
log4cxx::helpers::Class::forName(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d62d1 "org.apache.log4j.xml.DOMConfigurator"}) line 79
log4cxx::helpers::Loader::loadClass(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d62d1 "org.apache.log4j.xml.DOMConfigurator"}) line 56 + 9 bytes
log4cxx::helpers::OptionConverter::instantiateByClassName(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d62d1 "org.apache.log4j.xml.DOMConfigurator"}, const log4cxx::helpers::Class & {...}, const log4cxx::helpers::ObjectPtrT<log4cxx::helpers::Object> & {...}) line 362 + 9 bytes
log4cxx::helpers::OptionConverter::selectAndConfigure(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d63e1 "TraceTst.cfg"}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d6359 "org.apache.log4j.xml.DOMConfigurator"}, log4cxx::helpers::ObjectPtrT<log4cxx::spi::LoggerRepository> & {...}) line 399 + 46 bytes
log4cxx::LogManager::getLoggerRepository() line 99 + 55 bytes
log4cxx::LogManager::getLogger(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d30b9 "TraceTst.BeforeMain"}) line 124 + 15 bytes
log4cxx::Logger::getLogger(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & {0x003d30b9 "TraceTst.BeforeMain"}) line 473 + 13 bytes
BeforeMain() line 44 + 357 bytes
$E90() line 32 + 29 bytes
$E91() + 29 bytes
_initterm(void (void)* * 0x00716160 $S92, void (void)* * 0x00716a7c ___xc_z) line 525
_cinit() line 192 + 15 bytes
mainCRTStartup() line 205
KERNEL32! 7c816d4f()
Thanks for your help,
Moshe
Yuk 0.9.7 isnt a good version you should go with 0.9.8 in generall,however the crash your talking about is fairly simple, I found it before on the group, if you post what line its crashing on maybee I can give some insight. I think some variable has to be forced to be loaded before anything else cause the load order gets borked on msvc compiles for some reason.
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Matthew Kanwisher
Sent: Sunday, April 23, 2006 6:14 AM
To: Log4CXX User
Subject: Re: Logging before main() crashes in 0.9.7
On 4/22/06, Moshe Matitya <[EMAIL PROTECTED]> wrote:I am using log4cxx 0.9.7 on Windows with MSVC 6.0 SP6. I have found that attempting to log anything before main() is executed (e.g., in a function called from the initializer of a global static variable) will always result in a crash. This is apparently happening because of some log4cxx static data which has not yet been initialized. Has this problem been fixed in 0.9.8?Thanks,Moshe Z. Matitya
