SIGSEGV가 보내질 때 호출 할 시그널 핸들러를 만들었습니다. C를 사용하여 프로그램을 작성하고 Linux 및 Intel x86 프로세서를 사용하고 있습니다. sig 핸들러에서는 siginfo_t 구조체를 통해 전달되는 si_addr에 문제를 일으키는 명령어 주소 대신 값 0이 주어진 것처럼 보입니다. 나는 sigaction에 SIG_INFO 플래그를 설정하여 idk가 왜 이런 일이 일어나고 있는지를 보여줍니다.SIGSEGV의 시그널 처리 문제들
int main(){
mprotect(..., PROC_READ | PROC_WRITE /* | PROC_EXEC */); //cannot execute page
someMethodOnRestrictedPage();
//do some stuff
}
void init_sighandler(void) {
//initialize the sigaction so that sig handler is called when a SIGSEGV is thrown
struct sigaction * action;
action = (struct sigaction *) malloc(sizeof(struct sigaction));
action->sa_sigaction = sighandler;
sigemptyset (&action->sa_mask);
action->sa_flags = 0;
sigaddset(&action->sa_mask, SA_SIGINFO);
sigaddset(&action->sa_mask, SA_RESTART);
sigaction(SIGSEGV, action, NULL);
}
void sighandler(int sig, siginfo_t *siginfo, void *ucp){
printf("%x\n", siginfo->si_addr); // prints out 0
}
내가 궁금한데, 왜 세분화 오류를 처리하려고합니까? 핸들러에서 무엇을 할 계획입니까? –
의도적으로 SIGSEGV를 생성하기 위해 특정 메모리 페이지에 대한 액세스를 제한하고 있습니다. – user972276
당신이 어떤 플랫폼을 사용하고 있는지 알면 도움이 될 것입니다. –