如何在Linux上调试`SIGTERM`

时间:2014-08-14 15:06:46

标签: c++ linux

我的程序在运行时收到SIGTERM。原因不是内存(90%的系统内存是免费的),没有分段错误,没有其他自定义应用程序杀死它。 /var/log/messages并未在任何地方提及已终止的进程文件名和PID。 GDB无法调试进程,因为它在大线程上崩溃只计算(800个线程),而GDB无法使用这样的线程计数(好吧,它运行,但速度太低,以至于它没有崩溃,它只在高线程计数时崩溃)。 在Linux上是否有任何通用方法可以了解将SIGTERM发送到特定程序的过程和原因?如何在Linux上调试这些问题?

2 个答案:

答案 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和可执行名称,以及信号编号和   名。