如果我们在无限循环中增加指针,如何预测出现分段错误的位置?
我原以为我们可以使用报警信号处理程序,它会在每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;
}
答案 0 :(得分:2)
首先,如果有足够大的优化级别,编译器可能会完全删除无限for(;;)
循环。
每秒只显示指针并不是很有意义。典型的处理器每秒执行数十亿(即10 9 )的机器指令。在32位机器上,这意味着可以在几秒钟内扫描整个过程地址空间。
然后,在Linux / AMD64(和Linux / x86)上,堆栈向下增长(从较高地址到较低地址);因为你从main
调用框附近的局部变量开始,你很快就会到外面(即在堆栈开头之前=更高)。
您可能会捕获SIGSEGV
信号;这意味着使用SA_SIGINFO
标志安装具有sigaction(2)系统调用的处理器和系统特定处理程序。
实际上,在Linux上,您可能希望通过阅读/proc/self/maps
(或/proc/self/smaps
或proc(5)伪文件系统内的其他文件)来检索您的进程地址映射;这应该为您提供给定地址所属的段,然后您就能够了解该段的结束位置。