Ваша трассировка стека на самом деле очень проста для понимания:
- Вы где-то получили SIGSEGV,
- Ваш обработчик сигналов сделал все, что он делает, затем вызвал
abort()
- который произвел
raise(2)
системный вызов, вызвав __unified_syscall()
Причина, по которой вы не получаете трассировки стека в GDB, заключается в том, что
__unified_syscall
реализован всборка, и - не использует указатель фрейма, а
- не имеет надлежащих
cfi
директив для описания того, как отмотать его.
Я бы рассмотрелэто ошибка в dietlibc, довольно легко исправить на самом деле.Посмотрите, исправит ли вас этот (непроверенный) патч:
--- dietlibc-0.31/i386/unified.S.orig 2011-03-13 10:16:23.000000000 -0700
+++ dietlibc-0.31/i386/unified.S 2011-03-13 10:21:32.000000000 -0700
@@ -31,8 +31,14 @@ __unified_syscall:
movzbl %al, %eax
.L1:
push %edi
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (edi, 0)
push %esi
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (esi, 0)
push %ebx
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (ebx, 0)
movl %esp,%edi
/* we use movl instead of pop because otherwise a signal would
destroy the stack frame and crash the program, although it
@@ -61,8 +67,11 @@ __unified_syscall:
#endif
.Lnoerror:
pop %ebx
+ cfi_adjust_cfa_offset (-4)
pop %esi
+ cfi_adjust_cfa_offset (-4)
pop %edi
+ cfi_adjust_cfa_offset (-4)
/* here we go and "reuse" the return for weak-void functions */
#include "dietuglyweaks.h"
Если вы не можете перестроить dietlibc или если патч неправильный, вы все равно сможете лучше проанализировать трассировку стека.Насколько я могу сказать, __unified_syscall
не касается %ebp
.Таким образом, вы можете получить разумную трассировку стека, выполнив следующее:
define xbt
set $xbp = (void **)$arg0
while 1
x/2a $xbp
set $xbp = (void **)$xbp[0]
end
end
xbt $ebp
Примечание: , если xbt
сработает, он, вероятно, попадет в сорняки вокруг SIGSEGV
сигнальный кадр (этот кадр также не использует указатель кадра).Это может привести к полному мусору или к пропущенному кадру или двум (которые будут в точности кадрами, в которых произошел SIGSEGV
).
Так что вам действительно лучше получить правильные дескрипторы раскрутки в dietlibc.