0

如果我们在无限循环中增加一个指针,如何预测分段错误发生在哪里?

我认为我们可以使用警报信号处理程序,它会在每 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;

}
4

1 回答 1

2

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

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

然后,在 Linux/AMD64(和 Linux/x86)上,堆栈向下增长(从高地址到低地址);由于您从调用框架附近的局部变量开始 main,您将很快得到外部(即之前 = 更高的堆栈开头)。

你也许可以捕捉到SIGSEGV信号;这意味着使用标志安装带有sigaction(2)系统调用的处理器和系统特定的处理程序。SA_SIGINFO

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

于 2012-05-21T08:01:43.980 回答