你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
2015-04-29 23:15
302 查看
什么让你对C/C++如此恐惧?
本篇将继续上一篇来讨论段错误(Segmentation fault)。上一篇:
你的C/C++程序为什么无法运行?揭秘Segmentation fault(1)
追溯段错误
如果你觉得你已经理解了段错误的根源,也知道了如何防止段错误,那么可以到此为止。否则,下面的内容或许对你有所启发。malloc
我们开始为指针所指向的地址分配内存:注意,
(*dest) = (char*)malloc(sizeof(char)*n);的右边已经执行,但尚未将分配出的地址赋给指针
*dest。
接下来,我们的主角段错误的前夕:
上面的图告诉我们一些信息:
红线勾勒出的内容是:
从函数
func1的局部变量中取出指针
dest(char ** 型)指向的地址,正确的代码中地址是
0x7fffffffddc0,而错误的代码中地址则是
0x0.
下一步即将执行黄线勾勒出的内容
/* 注意这里的rax在错误的代码中为0x0 而rdx的值为malloc出的内存地址0x602010 */ mov QWORD PTR [rax],rdx
那么,当执行上面的代码时,错误的代码试图将malloc分配出的在堆上的内存地址当作值放在指针
dest指向的地址中。
地址:0x0 值:0x602010
那么就出现了上篇所说的,
0x0是不能被访问的地址,也就不可能完成赋值操作。所以就会出现段错误:
什么是段错误
对于很多人来讲。上面的分析比第一篇要深入一些,也许看得到真相前的每一步才能让人踏实。现在,我们来看看什么是段错误。
下图是一个进程地址空间的描述,这是一个旧图,网上到处都是,但可以用来理解VMA:
上面这幅图会告诉我们什么呢?
内核虚拟内存空间,你肯定访问不了.
用户栈,用户进程启动就会有这样一个结构,你超过它的上界就到了内核虚拟内存空间,就会出现段错误.
内存映射mmp区域.
堆,malloc、calloc就在这里找地址分配.(事实上不仅如此)
代码、数据段 包括全局变量、静态变量、代码、数据等等.
如果你访问了内核虚拟内存空间(就是比ebp大的空间,1都不行)、代码段、数据段都会引发段错误。
在上篇的例子中,是由于访问了图中红色圈出的保留区域造成的段错误。
补充一下x86_64的VMA-layout:
。
找到代码中的段错误
方法有很多。我也只会1个,毕竟我不写C/C++,更不是这方面的老手。利用coredump+gdb来做。
获取coredump的方法:
1.在shell中`ulimit -c unlimited` 2.运行你发生了段错误的程序
有了coredump,就可以拿gdb来掰掰了
gdb xx xxcoredump.
上图有几个信息:
1.signal 11,是什么呢?
2.Segmentation fualt 段错误
3.
stack2.c中的第8行出现错误.
4.细心观察还会看到函数
func1的参数
dest=0x0.
我想,对于这样一个简单的c程序,上面的信息足够了.
其它
也许后面还想看看mmap、mm的fault处理、页异常处理还有signal的一些东西.但本篇,就此结束.
相关文章推荐
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
- VS2012生成的C++程序无法在XP上运行:
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法 vc链接静态库的时候要注意的问题
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法
- 为什么C++程序无法打开相对路径的文件?
- 为什么VC中DEBUG版本可以正常运行的程序有时无法在RELEASE版本下正常运行(转)
- 我用dev-c++编译的C程序,为什么程序一运行就自动关闭
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法
- !!!有奖竞猜!!!运行以下程序,会出现什么问题?为什么?(一个C++的基础题)
- C++ 程序稳定运行一段时间后异常中止,为什么?vc6 运行库的bug!!!
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法
- 安装C++ GUI Qt 3 运行程序无法找到qt-mtnc321.dll
- 为什么VC中DEBUG版本可以正常运行的程序有时无法在RELEASE版本下正常运行
- Halcon转C++运行程序出现“应用程序无法正常启动0xc000007b”解决