eclipse+CDT调试segmentation fault错误
来源:互联网 发布:学软件开发工资待遇 编辑:程序博客网 时间:2024/05/18 01:38
先来看两段代码--
错误代码:
#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是完全没问题的。
- eclipse+CDT调试segmentation fault错误
- 调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 段错误(segmentation fault)总结及调试
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- 用GDB调试Segmentation Fault错误
- Segmentation fault段错误调试总结
- 段错误的调试方法 Segmentation fault
- segmentation fault的调试
- Segmentation fault以及调试
- 调试 Segmentation fault 问题
- GDB调试Segmentation Fault
- Shell中的循环语句for、while、until实例讲解
- leetCode:Count Complete Tree Nodes
- 混合自回归移动平均过程
- Leetcode: Sort List
- 学习笔记(objective-c)-继承
- eclipse+CDT调试segmentation fault错误
- node.js发送邮件
- RSA 公钥密码实验1
- 1. 推荐引擎初探
- 磁盘文件系统Fat、Fat32、NTFS、exFAT的优缺点
- Sprite Kit Swift游戏开发新手指导手册(2)
- iOS 之 Thread Runloop浅显认识说起
- nfs配置
- 链表接口的实现