如何预测分段故障发生的位置

时间:2012-05-21 06:06:23

标签: segmentation-fault signals infinite-loop

如果我们在无限循环中增加指针,如何预测出现分段错误的位置?

我原以为我们可以使用报警信号处理程序,它会在每1秒后调用一次,它会打印指针指向的地址,这样当发生分段错误时我们会得到一个非常接近的地址它发生了。

有没有更好的解决方案?如果有,那么请告诉。提前致谢

代码:

#define SECOND 1

int *str;

void  ALARMhandler(int sig)
{
     signal(SIGALRM, SIG_IGN);      


printf("ptr=%u \n",*str);

     alarm(SECOND);                     /* set alarm for next run   */
     signal(SIGALRM, ALARMhandler);     /* reinstall the handler    */
}



int main()
{

int *ptr;
str=&ptr;
int a;
ptr=&a;
signal(SIGALRM,ALARMhandler);    
alarm(SECOND);                   


for(;;)
{
    ptr++;


}

return 0;

}

1 个答案:

答案 0 :(得分:2)

首先,如果有足够大的优化级别,编译器可能会完全删除无限for(;;)循环。

每秒只显示指针并不是很有意义。典型的处理器每秒执行数十亿(即10 9 )的机器指令。在32位机器上,这意味着可以在几秒钟内扫描整个过程地址空间。

然后,在Linux / AMD64(和Linux / x86)上,堆栈向下增长(从较高地址到较低地址);因为你从main调用框附近的局部变量开始,你很快就会到外面(即在堆栈开头之前=更高)。

您可能会捕获SIGSEGV信号;这意味着使用SA_SIGINFO标志安装具有sigaction(2)系统调用的处理器和系统特定处理程序。

实际上,在Linux上,您可能希望通过阅读/proc/self/maps(或/proc/self/smapsproc(5)伪文件系统内的其他文件)来检索您的进程地址映射;这应该为您提供给定地址所属的段,然后您就能够了解该段的结束位置。