繁体   English   中英

两个线程同时中止()

[英]Simultaneous abort() in two threads

我有一些我以前从未见过的回溯。 请参见以下主题中的第2帧:

Thread 31 (process 8752):
#0  0x00faa410 in __kernel_vsyscall ()
#1  0x00b0b139 in sigprocmask () from /lib/libc.so.6
#2  0x00b0c7a2 in abort () from /lib/libc.so.6
#3  0x00752aa0 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib/libstdc++.so.6
#4  0x00750505 in ?? () from /usr/lib/libstdc++.so.6
#5  0x00750542 in std::terminate () from /usr/lib/libstdc++.so.6
#6  0x00750c65 in __cxa_pure_virtual () from /usr/lib/libstdc++.so.6
#7  0x00299c63 in ApplicationFunction()

Thread 1 (process 8749):
#0  0x00faa410 in __kernel_vsyscall ()
#1  0x00b0ad80 in raise () from /lib/libc.so.6
#2  0x00b0c691 in abort () from /lib/libc.so.6
#3  0x00b4324b in __libc_message () from /lib/libc.so.6
#4  0x00b495b6 in malloc_consolidate () from /lib/libc.so.6
#5  0x00b4b3bd in _int_malloc () from /lib/libc.so.6
#6  0x00b4d3ab in malloc () from /lib/libc.so.6
#7  0x08147f03 in AnotherApplicationFunction ()

当用gdb打开它并获得回溯它给我线程1.后来我看到了线程31所处的奇怪状态。这个线程来自我们遇到问题的库,所以我认为崩溃是由它引起的。

那是什么意思呢? 两个线程同时做违法的事情? 或者它是其中之一,在另一个中导致某种程度上的abort()?

操作系统是Linux Red Hat Enterprise 5.3,它是一个多处理器服务器。

很难确定,但是我第一次怀疑看到这些堆栈跟踪会导致内存损坏(可能是堆上的缓冲区溢出)。 如果是这种情况,则损坏可能是两个线程最终abort的根本原因。

你可以对你的应用进行valgrind吗?

看起来它可能是由线程1中的malloc检测到的堆损坏,导致或由线程31中的错误引起。

一些破碎的代码覆盖了线程31中的vtable可能很容易导致这种情况。

线程31中止的原因可能是因为它以某种方式破坏了应用程序堆。 然后,当主线程尝试分配内存时,堆数据结构处于错误状态,导致分配失败并再次中止应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM