【问题标题】:Tracing UNIX signal origins?追踪 UNIX 信号来源?
【发布时间】:2011-02-19 03:36:21
【问题描述】:

如果我有一个从其他进程接收信号的进程,有没有办法让我知道哪个进程(如果有)发送了信号?

strace 让我可以跟踪进程收到了哪些信号,但不允许我跟踪是谁发出的。

【问题讨论】:

  • 据我所知,如果使用 SIGKILL 或 SIGSTOP,当前的解决方案不允许我找出哪个进程杀死/停止了另一个进程。是吗?
  • 你必须看看这种巫术的动态跟踪方法,比如 bpftrace

标签: linux signals unix


【解决方案1】:

对于 Linux 用户,有一种非常简单的方法可以识别信号的来源。例如,下面是查找哪个任务向其他任务发送 SIGKILL。

cd /sys/kernel/debug/tracing
echo 'sig==9' > events/signal/signal_generate/filter 
echo 1 > events/signal/signal_generate/enable
: > trace
echo 1 > tracing_on
tail -f trace

一个实例,当我使用“pkill -9 sleep”时。

# cat trace
[...]
       pkill-2982  [001] d... 750347.835838: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=2981 grp=1 res=0

如果没有上面的 'sig==9' 过滤器,'trace' 将显示任务之间发送的所有信号。

【讨论】:

    【解决方案2】:

    Ptrace 也可以用来检测发件人。有一个ptrace(GETSIGINFO) 调用,这将使调试器有机会读取(并且可能更改)siginto_t 结构。

    【讨论】:

      【解决方案3】:

      不是来自流程之外。信号处理程序的第二个参数是 siginfo_t 结构,其中包含发送进程的 PID 作为其成员之一。详情请见sigaction(2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 2015-03-20
        • 2023-03-07
        • 2014-09-15
        • 2014-08-30
        • 1970-01-01
        相关资源
        最近更新 更多