linux - 哪个信号被传递给信号处理程序中的进程死锁

标签 linux debugging gdb signals core

我有一个核心转储来自调用信号处理程序后死锁的进程。如何确定传送了哪个信号以及是谁发送的?

接下来是 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
...

就其值(value)而言,handle_fatal_signal()my_print_stacktrace() 是 MySQL 函数。其余来自 Google 的 tcmalloc。

最佳答案

我会尝试“第 15 帧”移动到信号传递帧,然后是“print $_siginfo.si_signo”。参见 https://sourceware.org/gdb/onlinedocs/gdb/Signals.html

这至少适用于 Linux,我从您正在使用的回溯中推测。我不确定其他平台。

关于linux - 哪个信号被传递给信号处理程序中的进程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23680297/

相关文章:

c++ - Visual Studio中所谓的 "Frames"是什么?

java - 自动化 gdb - gdb 的管道 stdin 和 stdout

c - 为什么 GDB "thread apply all where"没有将所有输出发送到文件(只有一些......)?

linux - 为什么系统调用部分没有 `execlp()`

linux - 每分钟运行一次 sed 命令

c++ - 错误 : wrong number of arguments specified for ‘constructor’ attribute

debugging - 使用 gdb 和 gdbserver 远程设置断点

linux - GCC 在 Mac OS X 上编译程序,但在 Ubuntu 上不编译程序

c# - 需要 SQL 查询调试

javascript - Windows CMD 中对象属性的调试限制