1

我正在开发一个在 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?

非常感谢您的帮助。

问候。

马可·比西奥

4

1 回答 1

0

siginfo->si_pid没有意义,因为导致 SIGSEGV(在地址siginfo->si_addr)的线程是接收信号的同一线程。

请参阅signal(7) 联机帮助页

可以为整个进程(例如,当使用 kill(2) 发送时)或为特定线程(例如,作为执行结果生成的某些信号,例如 SIGSEGV 和 SIGFPE)生成(并因此挂起)信号特定的机器语言指令 是线程导向的(...)

于 2017-09-28T23:24:19.667 回答