【发布时间】:2012-03-27 22:14:39
【问题描述】:
我创建了一个信号处理程序,以便在发送 SIGSEGV 时调用。我正在使用 C 编写程序,还使用 Linux 和 intel x86 处理器。在 sig 处理程序中,看起来通过 siginfo_t 结构传入的 si_addr 被赋予值 0 而不是导致问题的指令地址的值。我在 sigaction 中设置了 SIG_INFO 标志,所以我知道为什么会这样。
下面是一些示例代码:
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,然后我正在处理它
-
了解您在哪个平台上可能会有所帮助,以及您是否可以发布一个很棒的最小测试程序。
-
执行 sighandler 时 siginfo 中还有什么?
标签: c segmentation-fault