linux 信号跟踪模块
如果进程因为接收到信号被杀死,一般使用 gdb 可以捕捉到是什么信号。但是 gdb 却无法得知信号是谁发出的。
这个时候,使用以下的 linux 信号跟踪模块,就可以在 dmesg
中,打印出是谁发送的信号。
以下的代码。是在linux下信号跟踪:jprobe_signal的基础上修改过来的。
其中添加了 name 参数,按照进程名称,过滤出信号接收进程。
name 参数: 指定信号接收进程的名称。默认是打印所有进程。
pid 参数: 指定信号接收进程的 pid。默认是打印所有进程。
signal 参数: 指定信号。默认是打印所有信号。
代码实现
signal_probe
模块代码signal_probe.c
如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>
#include <linux/sched.h>
#include <linux/string.h>
#define ANY_PID (-1)
#define ANY_SIGNAL (0)
#define IS_MATCH_ANY_PID(pid) ((pid) <= ANY_PID)
#define IS_MATCH_ANY_SIGNAL(signal) ((signal) <= ANY_SIGNAL)
#define IS_MATCH_ANY_NAME(name) ('\0' == name[0])
/* parameters of module */
static int g_pid = ANY_PID;
module_param_named(pid, g_pid, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(pid
, "The specified PID of receiver, -1 Reprensent any process. \
0 Represent no processes be traced. default is any process.");
static int g_signal = ANY_SIGNAL;
module_param_named(signal, g_signal, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(signal