Linux 使用sigaction捕获信号SIGSEGV
我正在开发一个运行在linux pc内核版本4.4.14上的多线程应用程序。我想跟踪一些导致分段错误的灾难性错误。 我设置了一个链接到SIGSEGV的信号处理程序,试图获取导致崩溃的线程的pid号。处理程序函数代码如下所示:Linux 使用sigaction捕获信号SIGSEGV,linux,signals,handler,segmentation-fault,sigaction,Linux,Signals,Handler,Segmentation Fault,Sigaction,我正在开发一个运行在linux pc内核版本4.4.14上的多线程应用程序。我想跟踪一些导致分段错误的灾难性错误。 我设置了一个链接到SIGSEGV的信号处理程序,试图获取导致崩溃的线程的pid号。处理程序函数代码如下所示: void sighandler(int signum, siginfo_t *siginfo, void *context) { // get pid of sender, pid_t sender_pid = siginfo->si_pid; p
void sighandler(int signum, siginfo_t *siginfo, void *context)
{
// get pid of sender,
pid_t sender_pid = siginfo->si_pid;
printf("Process %d got signal %d SEG FAULT !!!\n", (int)sender_pid, signum);
fflush(stdout);
sleep(1);
printf("Stdout Flushed %d got signal %d SEG FAULT !!!\n", sender_pid, signum);
trappola.sa_flags = 0;
trappola.sa_handler = SIG_DFL;
sigaction(signum, &trappola, NULL);
kill(getpid(), signum);
exit(-1);
}
在main()中,我使用以下链接了sighandler函数:
struct sigaction trappola;
memset(&trappola, 0x00, sizeof(trappola));
trappola.sa_flags = SA_SIGINFO;
trappola.sa_sigaction = sighandler;
sigaction(SIGSEGV, &trappola, NULL);
处理程序正在工作,但我无法获取导致故障的线程的pid。printf:
printf("Process %d got signal %d SEG FAULT !!!\n", (int)sender_pid, signum);
始终打印不同的数字作为发送者,没有任何一个是有意义的。
为什么我不能得到有问题线程的pid
我错在哪里?如何在处理程序函数中获取出错线程的pid
非常感谢你的帮助
问候
Marco Bisio
siginfo->si_pid
没有意义,因为导致SIGSEGV的线程(位于地址siginfo->si_addr
)与接收信号的线程相同
见:
可以为整个过程生成(并因此等待)信号
(例如,当使用kill(2)发送时)或针对特定线程(例如。,
某些信号,如SIGSEGV和SIGFPE,作为
执行特定机器语言指令的结果
是线程定向的(…)
siginfo->si_pid
没有意义,因为导致SIGSEGV的线程(地址siginfo->si_addr
)与接收信号的线程相同
见:
可以为整个过程生成(并因此等待)信号
(例如,当使用kill(2)发送时)或针对特定线程(例如。,
某些信号,如SIGSEGV和SIGFPE,作为
执行特定机器语言指令的结果
是线程定向的(…)
非常感谢您的回答。请耐心等待,但在我看来,线程驱动的sigsegv在处理程序中接收到的信号并不相同。我的意思是:main()安装处理程序并使用pthread_create….运行线程;之后线程有自己的pid号。我希望能够使用siginfo->si_pid从处理程序读取pid号;再次感谢MarcoBisio@mrcbis你没有告诉我们是什么让你这么做这不是同一个线程。使用调试器(
gdb
)您将知道SEGVULT的原因。非常感谢您的回答。请耐心等待,但在我看来,线程驱动的sigsegv在处理程序中接收信号时似乎不一样。我的意思是:main()安装处理程序并使用pthread_create….运行线程;之后线程有自己的pid号。我希望能够使用siginfo->si_pid从处理程序读取pid号;再次感谢MarcoBisio@mrcbis你没有告诉我们是什么让你这么做这不是同一个线程。使用调试器(gdb
)你就会知道是什么导致了这个故障。