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.

Reply via email to