哪个信号在信号处理程序中传递给进程死锁?

5

我有一个进程的核心转储,该进程在调用信号处理程序后发生了死锁。如何确定发送的信号是哪个,并且是谁发送的?

GDB生成的接收信号线程的回溯如下所示。信号处理程序在第15帧中被调用。

(gdb) bt
#0  0x00007fa9c204654b in sys_futex (w=0x7fa9c2263d80, value=2, loop=<value optimized out>) at ./src/base/linux_syscall_support.h:1789
#1  base::internal::SpinLockDelay (w=0x7fa9c2263d80, value=2, loop=<value optimized out>) at ./src/base/spinlock_linux-inl.h:87
#2  0x00007fa9c204774c in SpinLock::SlowLock (this=0x7fa9c2263d80) at src/base/spinlock.cc:132
#3  0x00007fa9c2037ee3 in Lock (this=0x7fa9c2263d80, start=0x7fa9bb3c04c8, end=0x7fa9bb3c04c0, N=3) at src/base/spinlock.h:75
#4  tcmalloc::CentralFreeList::RemoveRange (this=0x7fa9c2263d80, start=0x7fa9bb3c04c8, end=0x7fa9bb3c04c0, N=3) at src/central_freelist.cc:247
#5  0x00007fa9c203bae4 in tcmalloc::ThreadCache::FetchFromCentralCache (this=0x17efb40, cl=<value optimized out>, byte_size=32) at src/thread_cache.cc:162
#6  0x00007fa9c202b9cb in Allocate (size=<value optimized out>) at src/thread_cache.h:341
#7  do_malloc (size=<value optimized out>) at src/tcmalloc.cc:1068
#8  (anonymous namespace)::do_malloc_or_cpp_alloc (size=<value optimized out>) at src/tcmalloc.cc:1005
#9  0x00007fa9c204bfa8 in tc_realloc (old_ptr=0x0, new_size=32) at src/tcmalloc.cc:1517
#10 0x0000003a358c0f3b in ?? () from /usr/lib64/libstdc++.so.6
#11 0x0000003a358c2adf in ?? () from /usr/lib64/libstdc++.so.6
#12 0x0000003a358c2cae in __cxa_demangle () from /usr/lib64/libstdc++.so.6
#13 0x000000000085f6c7 in my_print_stacktrace ()
#14 0x00000000006a773a in handle_fatal_signal ()
#15 <signal handler called>
#16 tcmalloc::CentralFreeList::FetchFromSpans (this=0x7fa9c2263d80) at src/central_freelist.cc:298
#17 0x00007fa9c2037f88 in tcmalloc::CentralFreeList::RemoveRange (this=0x7fa9c2263d80, start=0x7fa9bb3c1468, end=0x7fa9bb3c1460, N=3) at src/central_freelist.cc:269
#18 0x00007fa9c203bae4 in tcmalloc::ThreadCache::FetchFromCentralCache (this=0x17efb40, cl=<value optimized out>, byte_size=32) at src/thread_cache.cc:162
...

值得一提的是,handle_fatal_signal()my_print_stacktrace()是MySQL函数。其余函数来自于Google的tcmalloc。


1
如果是x86-64,则可能可以从第14帧获取有关信号的信息。因此,如果确实是x86-64,请执行f 14,然后执行disas。并且请添加您使用的TCMalloc版本的信息。例如,在版本TCMalloc 2.0中,在此行central_freelist.cc:298中有此代码:span->objects = *(reinterpret_cast<void**>(result));。这可能意味着span是无效指针,并且您会收到SIGSEGV。 - user184968
在这里回答:https://dev59.com/hFnUa4cB1Zd3GeqPYTnG - Grapsus
1个回答

9

1
$_siginfo 方便变量仅在运行进程时可用(我只有一个核心转储)。 - Josh Johnson
2
这取决于核心是如何生成的以及您使用的gdb版本。我相信更近期的内核版本将其放入了一个核心注释中,而更近期的gdb版本知道如何读取它。gdb补丁于2012年11月8日发布;不确定内核是否也有更新。 - Tom Tromey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接