首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Log4cxx测井语句挂起

Log4cxx测井语句挂起
EN

Stack Overflow用户
提问于 2014-04-30 12:06:39
回答 1查看 571关注 0票数 1

我们有一个独立的VC++应用程序,我们使用log4cxx0.10.0版本添加了日志记录。应用程序将启动一个线程(在一些耗时的操作中),如果需要超过阈值时间,那么主线程将使用TerminateThread方法杀死线程。子线程函数还配置了一些日志记录prints.Log4CXX,其中配置了1MB大小的滚动文件附录,5MB的备份copies.Logging在大多数情况下正常工作。但是在某些情况下,主线程日志函数调用是在杀死子线程之后挂起的,因此整个应用程序处于挂起状态。应用程序的后续实例也将挂起。我们获取了应用程序的全部崩溃转储,并使用WinDbg进行了分析。

下面是应用程序的调用堆栈

代码语言:javascript
运行
复制
**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

随后的应用程序挂起以锁定文件并调用实例堆栈,如下所示

代码语言:javascript
运行
复制
**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是线程安全的。这个问题不经常发生,因此我们没有步骤以一致的方式重现。

当我们杀死儿童线程时,有什么需要解决的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 12:15:00

重新设计你的申请。TerminateThread本质上是隐式不安全的,因为线程使用的资源不被释放。当它持有一个锁时,您成功地终止了它,现在您的主线程正在尝试获取那个持有的锁。找到另一种终止线程的方法。

下面是堆栈跟踪中的锁:https://apache.googlesource.com/log4cxx/+/e3db59080a3506f0ed23e98cbcb2be58f0b15a20/src/main/cpp/logger.cpp#93

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23387676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档