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.