2014-04-30 56 views
1

我們有一個獨立的VC++應用程序,我們使用log4cxx0.10.0版本添加了日誌記錄。 應用程序將啓動一個線程(對於一些耗時的操作),並且如果它花費的時間超過閾值時間,那麼主線程將使用TerminateThread方法終止線程。子線程功能也有一些日誌打印。Log4CXX配置了1 MB大小的5個備份副本的滾動文件附加程序。在大多數情況下,日誌記錄工作正常。但在某些情況下,主線程日誌函數調用在殺死子線程後掛起,因此整個應用程序處於掛起狀態。 該應用程序的後續實例也掛起。我們對應用程序進行了完整的崩潰轉儲,並使用WinDbg進行分析。Log4cxx掛起記錄聲明

這裏是應用程序的調用堆棧

**00 ntdll!NtWaitForSingleObject+0xa 
01 ntdll!RtlpWaitOnCriticalSection+0xe8 
02 ntdll!RtlEnterCriticalSection+0xd1 
03 log4cxx!log4cxx::filter::DenyAllFilter::decide+0x194 
04 log4cxx!log4cxx::helpers::synchronized::synchronized+0x31 
05 log4cxx!log4cxx::Logger::callAppenders+0x81 
06 log4cxx!log4cxx::Logger::forcedLog+0xe5** 
07 Test!CXX_LOG(int LOG_TYPE = 0n2, char * format = 0x00000001`3f2a2ad8 "Main thread pint...")+0x463 [d:\test\saf\test.cpp @ 2360] 
08 test!TestFunction(int argc = 0n3, char ** argv = 0x00000001`3f2ae880, int level = 0n1)+0x586 [d:\test\saf\test.cpp @ 1634] 
09 test!main(int argc = 0n4, char ** argv = 0x00000000`00282920)+0x1820 [d:\test\saf\test.cpp @ 2309] 
0a test!__tmainCRTStartup(void)+0x13b [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c @ 278] 
0b kernel32!BaseThreadInitThunk+0xd 
0c ntdll!RtlUserThreadStart+0x1d 

和後續應用掛起鎖定實例的文件和調用堆棧如下

**ntdll!ZwLockFile+0xa 
KERNELBASE!LockFileEx+0xb2 
kernel32!LockFileEx+0x1b 
log4cxx!log4cxx::filter::DenyAllFilter::decide+0x2a89 
log4cxx!log4cxx::helpers::DatagramPacket::setData+0x559c 
log4cxx!log4cxx::helpers::FileOutputStream::write+0x82 
log4cxx!log4cxx::rolling::RollingFileAppenderSkeleton::getTriggeringPolicy+0x1ca 
log4cxx!log4cxx::helpers::OutputStreamWriter::write+0xbe 
log4cxx!log4cxx::WriterAppender::subAppend+0x7c 
log4cxx!log4cxx::rolling::RollingFileAppenderSkeleton::subAppend+0xd0 
log4cxx!log4cxx::WriterAppender::append+0x31 
log4cxx!log4cxx::AppenderSkeleton::doAppend+0x293 
log4cxx!log4cxx::helpers::AppenderAttachableImpl::appendLoopOnAppenders+0x40 
log4cxx!log4cxx::Logger::callAppenders+0xa3 
log4cxx!log4cxx::Logger::forcedLog+0xe5** 
test!CXX_LOG(int LOG_TYPE = 0n2, char * format = 0x00000001`3f2a3868 "Starting the application")+0x463 
test!main(int argc = 0n4, char ** argv = 0x00000000`00162920)+0x1806 
test!__tmainCRTStartup(void)+0x13b 
kernel32!BaseThreadInitThunk+0xd 
ntdll!RtlUserThreadStart+0x21 

我們已經檢查功能「決定」與鎖定無關。它只是返回一些常數值。我已經讀過LOG4CXX是線程安全的。這個問題不經常發生,因此我們沒有以一致的方式重現這些步驟。

當我們殺死子線程時,是否有任何需要解決的問題?

回答