2011-02-23 62 views
7

我用我以前没见过的东西进行回溯。看到这些线程框架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是在这个线程是我们有问题库因此我相信这次事故是由它造成的。

那么这是什么意思?两个线程同时做非法的事情?或者它是其中的一个,导致另一个中断()?

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

+1

你在Linux上,你为什么不运行valgrind(特别是memcheck,helgrind和DRD模块)? – 2011-02-23 16:51:29

+0

谢谢,我会与他们核对。这是一个复杂的程序,valgrind通常会提供大量的东西,但我会尝试分析一些孤立的部分 – 2011-02-24 09:15:44

回答

3

看起来它可以是堆损坏,在线程1的malloc通过检测,在线程引起或造成的误差31.

有些破片代码重写A.O.的线程31中的vtable很容易造成这种情况。

4

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

你能valgrind你的应用程序?

+0

是的,我将与valgrind – 2011-02-23 17:56:04

3

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

相关问题