Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用sigaction捕获信号SIGSEGV_Linux_Signals_Handler_Segmentation Fault_Sigaction - Fatal编程技术网

Linux 使用sigaction捕获信号SIGSEGV

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

我正在开发一个运行在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:

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
)你就会知道是什么导致了这个故障。