[英]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.