重写signal handler在debug的时候非常有用,比如发生了segment fault,如果想知道内存访问出错的地址,就可以通过写自己的信号处理函数,打印出错地址。
首先看sigaction函数。通过man sigaction可以看到详细信息。
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
第一个参数是指要处理的信号,第二个参数是sigaction 结构体,包含具体的handler信息,以下:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
第一个和第二个参数都是handle,但是只能同时指定一个。第二个可以得到更多的信息。其他参数可以查看man。我们再重点介绍以下siginfo_t这个结构。
siginfo_t {
int si_signo; /* Signal number */
int si_code; /* Signal code */
pid_t si_pid; /* Sending process ID */
使用sigaction和signalhandler进行调试

文章介绍了如何利用sigaction函数自定义信号处理程序,特别是在调试时如遇到segmentfault,可以通过获取siginfo_t结构体中的si_addr和si_code来定位错误地址和原因。示例代码展示了如何设置SIGSEGV信号的处理函数以打印错误信息。
最低0.47元/天 解锁文章
297

被折叠的 条评论
为什么被折叠?



