리눅스 PC 커널 버전 4.4.14에서 실행되는 멀티 스레드 응용 프로그램을 개발 중입니다. 세분화 오류를 일으키는 치명적인 오류를 추적하고 싶습니다. 충돌을 일으키는 스레드의 PID 번호를 얻으려고 SIGSEGV에 연결된 신호 처리기를 설정했습니다.신호 SIGSEGV sigaction을 사용하여 붙잡음
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);
}
주의() 내가 사용 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);
항상 0과 다른 숫자를 인쇄하십시오. 아무 것도 의미가 없습니다. 문제가되는 스레드의 PID를 가져올 수없는 이유는 무엇입니까?
내가 잘못 했나요? 처리기 함수에서 문제가되는 스레드의 PID를 어떻게 얻을 수 있습니까?
도움을 주셔서 감사합니다.
감사합니다. (어드레스 siginfo->si_addr
시)에 SIGSEGV 유발 스레드가 신호를 수신하고 동일한 스레드 때문에
마르코 Bisio
이 답변 주셔서 감사를 실행의 결과로 생성 등 SIGSEGV와 SIGFPE와 같은 특정 신호는,. 수 환자하지만 스레드 trowing sigsegv 같은 날 핸들러 내에서 신호를받을 것으로 보인다. main()은 핸들러를 설치하고 pthread_create ....를 사용하여 스레드를 실행합니다. 그 후에 스레드는 자신의 PID 번호를가집니다. 나는 siginfo-> si_pid를 사용하여 핸들러에서 해당 pid 번호를 읽을 수있을 것으로 예상했다. 다시 고맙습니다. Marco Bisio – mrcbis
@mrcbis 당신은이게 같은 스레드가 아니라는 것을 당신에게 알려주지 않습니다. 디버거 ('gdb')를 사용하면 segfault의 원인을 알 수 있습니다. – xhienne