在两个线程中同时中止()
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 测试中中止线程