eclipse+CDT调试segmentation fault错误

先来看两段代码--

错误代码:

#include "string.h"
#include <stdlib.h>
#include <stdio.h>

void test(char ** dest, char * src, int n) {
	(*dest) = (char*) malloc(sizeof(char) * n);
	strcpy(*dest, src);
}

int main(int argc, char** args) {
	char ** p = NULL;
	char str[] = "test segmentation fault";
	int len = sizeof(str);
	test(p, str, len);
}

正确代码:

#include "string.h"
#include <stdlib.h>
#include <stdio.h>

void test(char ** dest, char * src, int n) {
	(*dest) = (char*) malloc(sizeof(char) * n);
	strcpy(*dest, src);
}

int main(int argc, char** args) {
	char * p = NULL;
	char str[] = "test segmentation fault";
	int len = sizeof(str);
	test(&p, str, len);
}
如果用 coredump+gdb调试的话,会发现错误程序出现常见的 segmentation fault错误。

原因:这种错误往往是程序访问到了没有权限访问或者没有经过MMU映射的地址空间所致。

分析:一个应用程序启动时,系统会为其建立一个进程(Process),这个进程有独立的虚拟内存空间(VMA:Vertual memory area),如下图:


如上图,当应用程序进程访问红线标注的区域时,都会发生segmentation fault错误。

调试:接下来用eclipse的C/C++版(或者eclipse安装CDT)进行调试上面错误例子,图如下:


我们看到当我们用eclipse试图访问地址为0x0的指针*p的值时,出了错Cannot access memory at address 0x0。(验证了我们上面的分析,0x0地址无权限访问)

错析:现在来分析分析这个错误程序出错在哪里。

1)char ** p = NULL;这句话执行后指向指针的指针p的value为0x0,即*p指针的地址是0x0。

2)(*dest) = (char*) malloc(sizeof(char) * n);这句话分析:首先等式右边(char*) malloc(sizeof(char) * n)执行是没有错的,得到一个分配后的地址值,接下来将地址值赋给左边的*dest时问题出现了,通过前面分析知道*dest指针的地址也就是上面*p指针的地址是0x0,这个地址通过前面分析是无权访问的,应用程序赋值也就是进行了访问,这就是问题根源。

正确:现在来对比下正确的,如下图:


可以看到*dest也就是&p的地址值是0x28ff08,这个地址是可以访问的,所以当我们将分配到的地址值赋给*dest是完全没问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值