繁体   English   中英

为什么我在这里出现细分错误?

[英]Why am I getting segmentation fault here?

我有以下代码,在这里我尝试向堆栈中写入一些内容。 我写在堆栈的底部,应用程序仍未触及该堆栈的底部(请注意,堆栈向下增长,此处的stackaddr指向底部)。

但是,即使在执行mprotect给该内存区域授予写和读权限后,我仍然遇到分段错误。 即使使用编译标志-fno-stack-protector,我也会遇到分段错误。 这是怎么回事

pthread_attr_t attr;
void * stackaddr;
int * plocal_var;
size_t stacksize;

pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack( &attr, &stackaddr, &stacksize );

printf( "stackaddr = %p, stacksize = %d\n", stackaddr, stacksize );

plocal_var = (int*)stackaddr;
mprotect((void*)plocal_var, 4096, PROT_READ | PROT_WRITE);
*plocal_var = 4;
printf( "local_var = %d!\n", *plocal_var );

几乎可以肯定,您正在尝试mprotect()尚未映射的页面。 您应该检查返回代码: mprotect()可能返回-1并将errnoENOMEM (这在mprotect(2)手册页中进行了说明 )。

堆栈页面是按需映射的,但是内核足够聪明,可以区分由当前堆栈指针或当前堆栈指针之上的访问所引起的页面错误(这些错误是由有效尝试通过递减堆栈指针向下向下扩展堆栈引起的,然后执行对新值的某个正偏移量的读取或写入操作),以及由堆栈指针下方的访问引起的页面错误(无效)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM