我的程序在运行时收到SIGTERM
。原因不是内存(90%的系统内存是免费的),没有分段错误,没有其他自定义应用程序杀死它。 /var/log/messages
并未在任何地方提及已终止的进程文件名和PID。 GDB
无法调试进程,因为它在大线程上崩溃只计算(800个线程),而GDB
无法使用这样的线程计数(好吧,它运行,但速度太低,以至于它没有崩溃,它只在高线程计数时崩溃)。
在Linux上是否有任何通用方法可以了解将SIGTERM
发送到特定程序的过程和原因?如何在Linux上调试这些问题?
答案 0 :(得分:2)
这看起来很有趣。你可以找出谁发送信号:
SIGTERM
SA_SIGINFO
,以便获得siginfo_t
结构在处理程序中打印pid:
siginfo_t {
pid_t si_pid; /* Sending process ID */
}
为清楚起见,处理程序应如下所示:
void handler(int sig, siginfo_t *si, void *data);
答案 1 :(得分:1)
systemtap可以做到这一点。来自examples page:
process / sigmon.stp - 跟踪特定进程的特定信号
脚本监视发送到特定进程的特定信号。当该信号被发送到 在指定的进程中,脚本打印出发送进程的PID和可执行文件 信号,接收信号的过程的PID和可执行名称,以及信号编号和 名。