我正在开发一个在 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;
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("Process %d got signal %d SEG FAULT !!!\n", (int)sender_pid, signum);
总是将不同的数字打印为 sender_pid,这些数字都没有意义。为什么我无法获得违规线程的 pid?
我哪里错了?如何在处理函数中获取违规线程的 pid?
非常感谢您的帮助。
问候。
马可·比西奥