スタンドアロンの VC++ アプリケーションがあり、log4cxx0.10.0 バージョンを使用してログを追加しました。アプリケーションは (時間のかかる操作のために) スレッドを開始し、しきい値の時間を超える場合、メイン スレッドは TerminateThread メソッドを使用してスレッドを強制終了します。子スレッド関数には、いくつかのロギング プリントもあります。Log4CXX は、5 つのバックアップ コピーの 1 MB サイズのローリング ファイル アペンダーで構成されています。ロギングは、ほとんどのシナリオで正常に機能しています。ただし、一部のシナリオでは、子スレッドを強制終了した後にメイン スレッドのロギング関数呼び出しがハングするため、アプリケーション全体がハング状態になります。アプリケーションの後続のインスタンスもハングします。アプリケーションの完全なクラッシュ ダンプを取得し、WinDbg を使用して分析しました。
これがアプリケーションのコールスタックです
**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はスレッドセーフであることを読みました。この問題は頻繁には発生しないため、一貫した方法で再現する手順がありませんでした。
子スレッドを強制終了するときに対処する必要があることはありますか??