You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Stephen Webb (Jira)" <lo...@logging.apache.org> on 2022/09/09 06:51:00 UTC

[jira] [Comment Edited] (LOGCXX-532) Static objects and deleting

    [ https://issues.apache.org/jira/browse/LOGCXX-532?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17602153#comment-17602153 ] 

Stephen Webb edited comment on LOGCXX-532 at 9/9/22 6:50 AM:
-------------------------------------------------------------

As "multithreadtest" is a pathological case (calling exit() while other threads are logging),  perhaps Logger::forcedLog should be checking APRInitializer::isDestructed.

Below is the state of a failed multithreadtest Ubuntu 20.04 (G++ 9.4.0) process after a segmenation fault (generated by running multithreadtest - hundreds of invocations - until it failed):

 
{code:java}
(gdb) info thread
  Id   Target Id                          Frame 
* 1    Thread 0x7f13498ee700 (LWP 187725) __GI___libc_free (mem=0x7f134400105800) at malloc.c:3102
  2    Thread 0x7f13490ed700 (LWP 187726) 0x000055cf6ca45a3e in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::get (this=0x7f1344000c58)
    at /usr/include/c++/9/bits/unique_ptr.h:361
  3    Thread 0x7f13488ec700 (LWP 187727) _IO_new_file_sync (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at fileops.c:793
  4    Thread 0x7f13437fe700 (LWP 187730) std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
  5    Thread 0x7f133bfff700 (LWP 187729) 0x000055cf6ca426b7 in log4cxx::Logger::isInfoEnabled (
    this=0x55cf6c9fd760 <std::__shared_ptr_access<log4cxx::Logger, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const+28>) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:326
  6    Thread 0x7f1343fff700 (LWP 187728) std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
  7    Thread 0x7f1349e5f840 (LWP 187724) __pthread_clockjoin_ex (threadid=139720815208192, thread_return=0x0, clockid=<optimised out>, abstime=<optimised out>, block=<optimised out>)
    at pthread_join_common.c:145
(gdb) thread apply all backtrace
Thread 7 (Thread 0x7f1349e5f840 (LWP 187724)):
#0  __pthread_clockjoin_ex (threadid=139720815208192, thread_return=0x0, clockid=<optimised out>, abstime=<optimised out>, block=<optimised out>) at pthread_join_common.c:145
#1  0x00007f134a297047 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#2  0x000055cf6c9fd3f8 in MultithreadTest::testMultithreadedLoggers (this=0x7ffdcfb785c0) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:113
#3  0x000055cf6c9fda6d in LogUnit::runTest<MultithreadTest> (tc=0x7ffdcfb787f0, func=(void (MultithreadTest::*)(class MultithreadTest * const)) 0x55cf6c9fd306 <MultithreadTest::testMultithreadedLoggers()>) at /home/stephen/source/log4cxx/src/test/cpp/logunit.h:121
#4  0x000055cf6c9fcfe6 in MultithreadTest::RegisterSuite::testMultithreadedLoggersRegistration::run (tc=0x7ffdcfb787f0) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:84
#5  0x000055cf6ca01741 in abts_run_test (ts=0x55cf6db66d20, name=0x55cf6cb100ba "testMultithreadedLoggers", f=0x55cf6c9fcfb0 <MultithreadTest::RegisterSuite::testMultithreadedLoggersRegistration::run(abts_case*, void*)>, value=0x0) at /home/stephen/source/log4cxx/src/test/cpp/abts.cpp:210
#6  0x000055cf6ca039bc in LogUnit::TestSuite::run (this=0x55cf6cbbe180 <MultithreadTest::getSuite()::suite>, suite=0x55cf6db66d20) at /home/stephen/source/log4cxx/src/test/cpp/logunit.cpp:284
#7  0x000055cf6ca02f98 in abts_run_suites (suite=0x0) at /home/stephen/source/log4cxx/src/test/cpp/logunit.cpp:69
#8  0x000055cf6ca022c8 in main (argc=2, argv=0x7ffdcfb789f8) at /home/stephen/source/log4cxx/src/test/cpp/abts.cpp:591
Thread 6 (Thread 0x7f1343fff700 (LWP 187728)):
#0  std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
#1  0x000055cf6c9fd78d in std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=...) at /usr/include/c++/9/bits/uniform_int_dist.h:173
#2  0x000055cf6c9fc3f7 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:74
#3  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67a10: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#4  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67a10: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#5  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67a08) at /usr/include/c++/9/thread:244
#6  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67a08) at /usr/include/c++/9/thread:251
#7  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67a00) at /usr/include/c++/9/thread:195
#8  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#10 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 5 (Thread 0x7f133bfff700 (LWP 187729)):
#0  0x000055cf6ca426b7 in log4cxx::Logger::isInfoEnabled (this=0x55cf6c9fd760 <std::__shared_ptr_access<log4cxx::Logger, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const+28>) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:326
#1  0x000055cf6c9fc309 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#2  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67ce0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#3  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67ce0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#4  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67cd8) at /usr/include/c++/9/thread:244
#5  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67cd8) at /usr/include/c++/9/thread:251
#6  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67cd0) at /usr/include/c++/9/thread:195
#7  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#9  0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 4 (Thread 0x7f13437fe700 (LWP 187730)):
#0  std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
#1  0x000055cf6c9fd78d in std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=...) at /usr/include/c++/9/bits/uniform_int_dist.h:173
#2  0x000055cf6c9fc3f7 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:74
#3  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67e90: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#4  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67e90: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#5  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67e88) at /usr/include/c++/9/thread:244
#6  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67e88) at /usr/include/c++/9/thread:251
#7  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67e80) at /usr/include/c++/9/thread:195
#8  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#10 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 3 (Thread 0x7f13488ec700 (LWP 187727)):
#0  _IO_new_file_sync (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at fileops.c:793
#1  0x00007f1349ee63f6 in __GI__IO_fflush (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at libioP.h:948
#2  0x00007f134a2f27a3 in std::ostream::flush() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f134a27b936 in std::ios_base::Init::~Init() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f1349eaa8d7 in __run_exit_handlers (status=0, listp=0x7f134a050718 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:108
#5  0x00007f1349eaaa90 in __GI_exit (status=<optimised out>) at exit.c:139
#6  0x000055cf6c9fed8b in std::__invoke_impl<void, void (&)(int) noexcept, int>(std::__invoke_other, void (&)(int) noexcept, int&&) (__f=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/bits/invoke.h:60
#7  0x000055cf6c9fe558 in std::__invoke<void (&)(int) noexcept, int>(void (&)(int) noexcept, int&&) (__fn=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/bits/invoke.h:95
#8  0x000055cf6c9fd7ce in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#1}::operator()() const (this=0x7f13488e9530) at /usr/include/c++/9/mutex:671
#9  0x000055cf6c9fd7f9 in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#2}::operator()() const (this=0x0) at /usr/include/c++/9/mutex:676
#10 0x000055cf6c9fd80e in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#2}::_FUN() () at /usr/include/c++/9/mutex:676
#11 0x00007f134a3e147f in __pthread_once_slow (once_control=0x55cf6cbbe16c <multithread_logger(int)::exiting>, init_routine=0x7f134a295c20 <__once_proxy>) at pthread_once.c:116
#12 0x000055cf6c9fc62d in __gthread_once (__once=0x55cf6cbbe16c <multithread_logger(int)::exiting>, __func=0x7f134a295c20 <__once_proxy>) at /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:700
#13 0x000055cf6c9fd8a0 in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&) (__once=..., __f=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/mutex:683
#14 0x000055cf6c9fc42e in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:76
#15 0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67890: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#16 0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67890: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#17 0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67888) at /usr/include/c++/9/thread:244
#18 0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67888) at /usr/include/c++/9/thread:251
#19 0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67880) at /usr/include/c++/9/thread:195
#20 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#21 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#22 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 2 (Thread 0x7f13490ed700 (LWP 187726)):
#0  0x000055cf6ca45a3e in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::get (this=0x7f1344000c58) at /usr/include/c++/9/bits/unique_ptr.h:361
#1  0x000055cf6ca453ea in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::operator-> (this=0x7f1344000c58) at /usr/include/c++/9/bits/unique_ptr.h:355
#2  0x000055cf6ca4210e in log4cxx::Logger::getHierarchy (this=0x7f1344000c50) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:228
#3  0x000055cf6ca426ce in log4cxx::Logger::isInfoEnabled (this=0x7f1344000c50) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:327
#4  0x000055cf6c9fc309 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#5  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db678b0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#6  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db678b0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#7  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db678a8) at /usr/include/c++/9/thread:244
#8  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db678a8) at /usr/include/c++/9/thread:251
#9  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db678a0) at /usr/include/c++/9/thread:195
#10 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#12 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 1 (Thread 0x7f13498ee700 (LWP 187725)):
#0  __GI___libc_free (mem=0x7f134400105800) at malloc.c:3102
#1  0x000055cf6ca47cd5 in log4cxx::spi::LoggingEvent::LoggingEventPrivate::~LoggingEventPrivate (this=0x7f1344000f8f, __in_chrg=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:74
#2  0x000055cf6ca48428 in std::default_delete<log4cxx::spi::LoggingEvent::LoggingEventPrivate>::operator() (this=0x7f1344000d98, __ptr=0x7f1344000f8f) at /usr/include/c++/9/bits/unique_ptr.h:81
#3  0x000055cf6ca47ea0 in std::unique_ptr<log4cxx::spi::LoggingEvent::LoggingEventPrivate, std::default_delete<log4cxx::spi::LoggingEvent::LoggingEventPrivate> >::~unique_ptr (this=0x7f1344000d98, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/unique_ptr.h:292
#4  0x000055cf6ca468a4 in log4cxx::spi::LoggingEvent::~LoggingEvent (this=0x7f1344000d90, __in_chrg=<optimised out>, __vtt_parm=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:161
#5  0x000055cf6ca468dc in log4cxx::spi::LoggingEvent::~LoggingEvent (this=0x7f1344000d90, __in_chrg=<optimised out>, __vtt_parm=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:163
#6  0x000055cf6ca463f6 in std::_Sp_counted_ptr<log4cxx::spi::LoggingEvent*, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x7f1344000e30) at /usr/include/c++/9/bits/shared_ptr_base.h:377
#7  0x000055cf6c9fe1f6 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x7f1344000e30) at /usr/include/c++/9/bits/shared_ptr_base.h:155
#8  0x000055cf6c9fd541 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x7f13498eb508, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr_base.h:730
#9  0x000055cf6ca215f6 in std::__shared_ptr<log4cxx::spi::LoggingEvent, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x7f13498eb500, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr_base.h:1169
#10 0x000055cf6ca21616 in std::shared_ptr<log4cxx::spi::LoggingEvent>::~shared_ptr (this=0x7f13498eb500, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr.h:103
#11 0x000055cf6ca41b1c in log4cxx::Logger::forcedLog (this=0x7f1344000c50, level1=std::shared_ptr<log4cxx::Level> (use count 1140854665, weak count 32530) = {...}, message="This is a test message that has some data", location=...) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:167
#12 0x000055cf6c9fc3c0 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#13 0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67730: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#14 0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67730: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#15 0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67728) at /usr/include/c++/9/thread:244
#16 0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67728) at /usr/include/c++/9/thread:251
#17 0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67720) at /usr/include/c++/9/thread:195
#18 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#19 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#20 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
{code}
 

 


was (Author: swebb2066):
As "multithreadtest" is a pathological case (calling exit() while other threads are logging), and perhaps Logger::forcedLog should be checking APRInitializer::isDestructed.

Below is the state of a failed multithreadtest Ubuntu 20.04 (G++ 9.4.0) process after a segmenation fault (generated by running multithreadtest - hundreds of invocations - until it failed):

 
{code:java}
(gdb) info thread
  Id   Target Id                          Frame 
* 1    Thread 0x7f13498ee700 (LWP 187725) __GI___libc_free (mem=0x7f134400105800) at malloc.c:3102
  2    Thread 0x7f13490ed700 (LWP 187726) 0x000055cf6ca45a3e in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::get (this=0x7f1344000c58)
    at /usr/include/c++/9/bits/unique_ptr.h:361
  3    Thread 0x7f13488ec700 (LWP 187727) _IO_new_file_sync (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at fileops.c:793
  4    Thread 0x7f13437fe700 (LWP 187730) std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
  5    Thread 0x7f133bfff700 (LWP 187729) 0x000055cf6ca426b7 in log4cxx::Logger::isInfoEnabled (
    this=0x55cf6c9fd760 <std::__shared_ptr_access<log4cxx::Logger, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const+28>) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:326
  6    Thread 0x7f1343fff700 (LWP 187728) std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
  7    Thread 0x7f1349e5f840 (LWP 187724) __pthread_clockjoin_ex (threadid=139720815208192, thread_return=0x0, clockid=<optimised out>, abstime=<optimised out>, block=<optimised out>)
    at pthread_join_common.c:145
(gdb) thread apply all backtrace
Thread 7 (Thread 0x7f1349e5f840 (LWP 187724)):
#0  __pthread_clockjoin_ex (threadid=139720815208192, thread_return=0x0, clockid=<optimised out>, abstime=<optimised out>, block=<optimised out>) at pthread_join_common.c:145
#1  0x00007f134a297047 in std::thread::join() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#2  0x000055cf6c9fd3f8 in MultithreadTest::testMultithreadedLoggers (this=0x7ffdcfb785c0) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:113
#3  0x000055cf6c9fda6d in LogUnit::runTest<MultithreadTest> (tc=0x7ffdcfb787f0, func=(void (MultithreadTest::*)(class MultithreadTest * const)) 0x55cf6c9fd306 <MultithreadTest::testMultithreadedLoggers()>) at /home/stephen/source/log4cxx/src/test/cpp/logunit.h:121
#4  0x000055cf6c9fcfe6 in MultithreadTest::RegisterSuite::testMultithreadedLoggersRegistration::run (tc=0x7ffdcfb787f0) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:84
#5  0x000055cf6ca01741 in abts_run_test (ts=0x55cf6db66d20, name=0x55cf6cb100ba "testMultithreadedLoggers", f=0x55cf6c9fcfb0 <MultithreadTest::RegisterSuite::testMultithreadedLoggersRegistration::run(abts_case*, void*)>, value=0x0) at /home/stephen/source/log4cxx/src/test/cpp/abts.cpp:210
#6  0x000055cf6ca039bc in LogUnit::TestSuite::run (this=0x55cf6cbbe180 <MultithreadTest::getSuite()::suite>, suite=0x55cf6db66d20) at /home/stephen/source/log4cxx/src/test/cpp/logunit.cpp:284
#7  0x000055cf6ca02f98 in abts_run_suites (suite=0x0) at /home/stephen/source/log4cxx/src/test/cpp/logunit.cpp:69
#8  0x000055cf6ca022c8 in main (argc=2, argv=0x7ffdcfb789f8) at /home/stephen/source/log4cxx/src/test/cpp/abts.cpp:591
Thread 6 (Thread 0x7f1343fff700 (LWP 187728)):
#0  std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
#1  0x000055cf6c9fd78d in std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f1343ffc588, __urng=...) at /usr/include/c++/9/bits/uniform_int_dist.h:173
#2  0x000055cf6c9fc3f7 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:74
#3  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67a10: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#4  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67a10: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#5  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67a08) at /usr/include/c++/9/thread:244
#6  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67a08) at /usr/include/c++/9/thread:251
#7  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67a00) at /usr/include/c++/9/thread:195
#8  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#10 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 5 (Thread 0x7f133bfff700 (LWP 187729)):
#0  0x000055cf6ca426b7 in log4cxx::Logger::isInfoEnabled (this=0x55cf6c9fd760 <std::__shared_ptr_access<log4cxx::Logger, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const+28>) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:326
#1  0x000055cf6c9fc309 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#2  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67ce0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#3  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67ce0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#4  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67cd8) at /usr/include/c++/9/thread:244
#5  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67cd8) at /usr/include/c++/9/thread:251
#6  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67cd0) at /usr/include/c++/9/thread:195
#7  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#9  0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 4 (Thread 0x7f13437fe700 (LWP 187730)):
#0  std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=..., __param=...) at /usr/include/c++/9/bits/uniform_int_dist.h:246
#1  0x000055cf6c9fd78d in std::uniform_int_distribution<int>::operator()<std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul> > (this=0x7f13437fb588, __urng=...) at /usr/include/c++/9/bits/uniform_int_dist.h:173
#2  0x000055cf6c9fc3f7 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:74
#3  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67e90: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#4  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67e90: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#5  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67e88) at /usr/include/c++/9/thread:244
#6  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67e88) at /usr/include/c++/9/thread:251
#7  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67e80) at /usr/include/c++/9/thread:195
#8  0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#10 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 3 (Thread 0x7f13488ec700 (LWP 187727)):
#0  _IO_new_file_sync (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at fileops.c:793
#1  0x00007f1349ee63f6 in __GI__IO_fflush (fp=0x7f134a0516a0 <_IO_2_1_stdout_>) at libioP.h:948
#2  0x00007f134a2f27a3 in std::ostream::flush() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f134a27b936 in std::ios_base::Init::~Init() () from /lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f1349eaa8d7 in __run_exit_handlers (status=0, listp=0x7f134a050718 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:108
#5  0x00007f1349eaaa90 in __GI_exit (status=<optimised out>) at exit.c:139
#6  0x000055cf6c9fed8b in std::__invoke_impl<void, void (&)(int) noexcept, int>(std::__invoke_other, void (&)(int) noexcept, int&&) (__f=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/bits/invoke.h:60
#7  0x000055cf6c9fe558 in std::__invoke<void (&)(int) noexcept, int>(void (&)(int) noexcept, int&&) (__fn=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/bits/invoke.h:95
#8  0x000055cf6c9fd7ce in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#1}::operator()() const (this=0x7f13488e9530) at /usr/include/c++/9/mutex:671
#9  0x000055cf6c9fd7f9 in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#2}::operator()() const (this=0x0) at /usr/include/c++/9/mutex:676
#10 0x000055cf6c9fd80e in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&)::{lambda()#2}::_FUN() () at /usr/include/c++/9/mutex:676
#11 0x00007f134a3e147f in __pthread_once_slow (once_control=0x55cf6cbbe16c <multithread_logger(int)::exiting>, init_routine=0x7f134a295c20 <__once_proxy>) at pthread_once.c:116
#12 0x000055cf6c9fc62d in __gthread_once (__once=0x55cf6cbbe16c <multithread_logger(int)::exiting>, __func=0x7f134a295c20 <__once_proxy>) at /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:700
#13 0x000055cf6c9fd8a0 in std::call_once<void (&)(int) noexcept, int>(std::once_flag&, void (&)(int) noexcept, int&&) (__once=..., __f=@0x7f1349eaaa70: {void (int)} 0x7f1349eaaa70 <__GI_exit>) at /usr/include/c++/9/mutex:683
#14 0x000055cf6c9fc42e in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:76
#15 0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67890: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#16 0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67890: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#17 0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67888) at /usr/include/c++/9/thread:244
#18 0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67888) at /usr/include/c++/9/thread:251
#19 0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67880) at /usr/include/c++/9/thread:195
#20 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#21 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#22 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 2 (Thread 0x7f13490ed700 (LWP 187726)):
#0  0x000055cf6ca45a3e in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::get (this=0x7f1344000c58) at /usr/include/c++/9/bits/unique_ptr.h:361
#1  0x000055cf6ca453ea in std::unique_ptr<log4cxx::Logger::LoggerPrivate, std::default_delete<log4cxx::Logger::LoggerPrivate> >::operator-> (this=0x7f1344000c58) at /usr/include/c++/9/bits/unique_ptr.h:355
#2  0x000055cf6ca4210e in log4cxx::Logger::getHierarchy (this=0x7f1344000c50) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:228
#3  0x000055cf6ca426ce in log4cxx::Logger::isInfoEnabled (this=0x7f1344000c50) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:327
#4  0x000055cf6c9fc309 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#5  0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db678b0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#6  0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db678b0: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#7  0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db678a8) at /usr/include/c++/9/thread:244
#8  0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db678a8) at /usr/include/c++/9/thread:251
#9  0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db678a0) at /usr/include/c++/9/thread:195
#10 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#11 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#12 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Thread 1 (Thread 0x7f13498ee700 (LWP 187725)):
#0  __GI___libc_free (mem=0x7f134400105800) at malloc.c:3102
#1  0x000055cf6ca47cd5 in log4cxx::spi::LoggingEvent::LoggingEventPrivate::~LoggingEventPrivate (this=0x7f1344000f8f, __in_chrg=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:74
#2  0x000055cf6ca48428 in std::default_delete<log4cxx::spi::LoggingEvent::LoggingEventPrivate>::operator() (this=0x7f1344000d98, __ptr=0x7f1344000f8f) at /usr/include/c++/9/bits/unique_ptr.h:81
#3  0x000055cf6ca47ea0 in std::unique_ptr<log4cxx::spi::LoggingEvent::LoggingEventPrivate, std::default_delete<log4cxx::spi::LoggingEvent::LoggingEventPrivate> >::~unique_ptr (this=0x7f1344000d98, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/unique_ptr.h:292
#4  0x000055cf6ca468a4 in log4cxx::spi::LoggingEvent::~LoggingEvent (this=0x7f1344000d90, __in_chrg=<optimised out>, __vtt_parm=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:161
#5  0x000055cf6ca468dc in log4cxx::spi::LoggingEvent::~LoggingEvent (this=0x7f1344000d90, __in_chrg=<optimised out>, __vtt_parm=<optimised out>) at /home/stephen/source/log4cxx/src/main/cpp/loggingevent.cpp:163
#6  0x000055cf6ca463f6 in std::_Sp_counted_ptr<log4cxx::spi::LoggingEvent*, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x7f1344000e30) at /usr/include/c++/9/bits/shared_ptr_base.h:377
#7  0x000055cf6c9fe1f6 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x7f1344000e30) at /usr/include/c++/9/bits/shared_ptr_base.h:155
#8  0x000055cf6c9fd541 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x7f13498eb508, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr_base.h:730
#9  0x000055cf6ca215f6 in std::__shared_ptr<log4cxx::spi::LoggingEvent, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x7f13498eb500, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr_base.h:1169
#10 0x000055cf6ca21616 in std::shared_ptr<log4cxx::spi::LoggingEvent>::~shared_ptr (this=0x7f13498eb500, __in_chrg=<optimised out>) at /usr/include/c++/9/bits/shared_ptr.h:103
#11 0x000055cf6ca41b1c in log4cxx::Logger::forcedLog (this=0x7f1344000c50, level1=std::shared_ptr<log4cxx::Level> (use count 1140854665, weak count 32530) = {...}, message="This is a test message that has some data", location=...) at /home/stephen/source/log4cxx/src/main/cpp/logger.cpp:167
#12 0x000055cf6c9fc3c0 in multithread_logger (times=20000) at /home/stephen/source/log4cxx/src/test/cpp/multithreadtest.cpp:72
#13 0x000055cf6ca011a4 in std::__invoke_impl<void, void (*)(int), int> (__f=@0x55cf6db67730: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:60
#14 0x000055cf6ca01106 in std::__invoke<void (*)(int), int> (__fn=@0x55cf6db67730: 0x55cf6c9fc1e8 <multithread_logger(int)>) at /usr/include/c++/9/bits/invoke.h:95
#15 0x000055cf6ca01065 in std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul> (this=0x55cf6db67728) at /usr/include/c++/9/thread:244
#16 0x000055cf6ca0101c in std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator() (this=0x55cf6db67728) at /usr/include/c++/9/thread:251
#17 0x000055cf6ca00ffc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run (this=0x55cf6db67720) at /usr/include/c++/9/thread:195
#18 0x00007f134a296de4 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#19 0x00007f134a3d8609 in start_thread (arg=<optimised out>) at pthread_create.c:477
#20 0x00007f1349f83163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
{code}
 

 

> Static objects and deleting
> ---------------------------
>
>                 Key: LOGCXX-532
>                 URL: https://issues.apache.org/jira/browse/LOGCXX-532
>             Project: Log4cxx
>          Issue Type: Improvement
>            Reporter: Robert Middleton
>            Assignee: Robert Middleton
>            Priority: Minor
>
> As seen in LOGCXX-430 and LOGCXX-322, making sure that when an application terminates earlier than expected we don't crash is rather hard to do.
> I came across this solution when researching this problem:
> https://stackoverflow.com/a/470545/624483
> My thought is that we create something like a log4cxx::Globals class, which contains a smart pointer to everything that must be kept alive before the library can safely be unloaded.  In each thread, you would do something like:
> {{GlobalsPtr globals = log4cxx::globals;}}
> thus ensuring that the destructor can't run before all of the threads are stopped.  This would be up to the user of the library.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)