在两个线程中同时中止()

Posted

技术标签:

【中文标题】在两个线程中同时中止()【英文标题】:Simultaneous abort() in two threads 【发布时间】:2011-07-02 21:50:25 【问题描述】:

我有一个以前没见过的东西的回溯。请参阅这些线程中的第 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,它是一个多处理器服务器。

【问题讨论】:

你在 Linux 上,为什么不直接运行 valgrind(特别是 memcheck、helgrind 和 DRD 模块)? 谢谢,我会和他们核实一下。这是一个复杂的程序,valgrind 通常会提供很多东西,但我会尝试分析一些孤立的部分 【参考方案1】:

很难确定,但我看到这些堆栈跟踪的第一个怀疑是内存损坏(可能是堆上的缓冲区溢出)。如果是这种情况,那么损坏可能是两个线程都以abort 结尾的根本原因。

你能valgrind你的应用吗?

【讨论】:

是的,我会与 valgrind 核实【参考方案2】:

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

一些损坏的代码覆盖 a.o.线程 31 中的 vtable 很容易导致这种情况。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在两个线程中同时中止()的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSTEST 和 Selenium 在并行 Web 测试中中止线程

如果一个 NSManagedObjectContext 实例同时保存在两个线程中怎么办?

同时运行两个线程

RestSharp组件中止线程问题

两个线程不能同时作用于同一个对象吗[关闭]

如何在 c++ winform 中同时运行两个函数?