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: Segmentation fault log4cxx 0.10.0 on app exit ( RH Linux)
Date Fri, 30 May 2008 19:22:10 GMT

On May 29, 2008, at 2:15 PM, GregN wrote:

>
> Segmentation fault on app exit.
>
> log4cxx, apr-1.2.12 and apr-util-1.2.12 had been build from tar file.
>
> gcc -v
> Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.3/specs
> Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
> --infodir=/usr/share/info --enable-shared --enable-threads=posix
> --disable-checking --with-system-zlib --enable-__cxa_atexit
> --disable-libunwind-exceptions --enable-java-awt=gtk
> --host=i386-redhat-linux
> Thread model: posix
> gcc version 3.4.3 20050227 (Red Hat 3.4.3-22.1)
>
> $ uname -a
> Linux gredhat4 2.6.9-11.EL #1 Fri May 20 18:17:57 EDT 2005 i686 i686  
> i386
> GNU/Linux
>
>
> Test app successfully writes one line in log file with code:
> int main() {
>    PropertyConfigurator::configure(LOG_PROPERTIES_FILE_LOCATION);
>    LoggerPtr LogManager::cplusLoggerPtr = Logger::getLogger("API");
>    LOG4CXX_INFO(cplusLoggerPtr , "test_info");
>    return 0;
> }
>
>
> C++ [C/C++ Local Application]	
> 	gdb/mi (5/29/08 2:31 PM) (Suspended)	
> 		Thread [1] (Suspended: Signal 'SIGSEGV' received. Description:
> Segmentation fault.)	
> 			8 apr_atomic_dec32() atomic/unix/apr_atomic.c:310 0xb7d1efba	
> 			7 log4cxx::helpers::ObjectImpl::releaseRef()
> /home/grn/Projects/apache-log4cxx-0.10.0/src/main/cpp/objectimpl.cpp: 
> 44
> 0xb7e36da0	
> 			6 log4cxx::Logger::releaseRef()
> /home/grn/Projects/apache-log4cxx-0.10.0/src/main/cpp/logger.cpp:62
> 0xb7e20c5d	
> 			5 ~ObjectPtrT() /usr/local/include/log4cxx/helpers/objectptr.h:100
> 0x080550e3	
> 			4 __tcf_1() /home/..project specific...	
> 			3 exit()  0x004ce467	
> 			2 __libc_start_main()  0x004b8e2d	
> 			1 _start()  0x080545ad
>
> Any suggestion is welcome...
>
> Thanks,
> Gregory	
>

APR goes to great length to try to use a platform provided atomic  
increment and decrement operation to implement apr_atomic_dec32 and  
apr_atomic_inc32, but contains a fallback implementation that uses APR  
mutexes to guard the operation.  The stack trace suggests that the  
fallback mechanism was used after APR was terminated  
APRInitializer::~APRInitializer.  Only the fallback implementation is  
susceptible to crashing if APR is terminated prematurely.

It is unclear why was the fallback implementation of apr_atomic_dec32  
compiled when building APR.  From your platform description, it  
appears that the inline assembler implementations near the top of  
atomic/unix/apr_atomic.c should have been compiled.

You could probably avoid the Segmentation fault by changing:

LoggerPtr LogManager::cplusLoggerPtr = Logger::getLogger("API");

to:

LoggerPtr LogManager::cplusLoggerPtr(Logger::getLogger("API"));

The problem is that the default constructor for LoggerPtr does not  
initialize APR and so when things are destructed, APR gets terminated  
before the LoggerPtr is released.  Using the one operation constructor  
causes APR to be initialized before the LoggerPtr is constructed and  
so the destruction occurs in the proper order.

Mime
View raw message