簡體   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