你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)

甚么让你对C/C++如此恐惧?

本篇将继续上1篇来讨论段毛病(Segmentation fault)。
上1篇:
你的C/C++程序为何没法运行?揭秘Segmentation fault(1)

追溯段毛病

如果你觉得你已理解了段毛病的本源,也知道了如何避免段毛病,那末可以到此为止。否则,下面的内容也许对你有所启发。

malloc

我们开始为指针所指向的地址分配内存:
这里写图片描述

注意,(*dest) = (char*)malloc(sizeof(char)*n);的右侧已履行,但还没有将分配出的地址赋给指针*dest

接下来,我们的主角段毛病的前夕:

这里写图片描述

上面的图告知我们1些信息:

红线勾画出的内容是:
从函数func1的局部变量中取出指针dest(char ** 型)指向的地址,正确的代码中地址是0x7fffffffddc0,而毛病的代码中地址则是0x0.

下1步行将履行黄线勾画出的内容

/*
注意这里的rax在毛病的代码中为0x0
而rdx的值为malloc出的内存地址0x602010
*/

mov QWORD PTR [rax],rdx

那末,当履行上面的代码时,毛病的代码试图将malloc分配出的在堆上的内存地址当作值放在指针dest指向的地址中。

地址:0x0 值:0x602010

那末就出现了上篇所说的,0x0是不能被访问的地址,也就不可能完成赋值操作。所以就会出现段毛病
这里写图片描述

甚么是段毛病

对很多人来说。上面的分析比第1篇要深入1些,或许看得到真相前的每步才能让人踏实。

现在,我们来看看甚么是段毛病。

下图是1个进程地址空间的描写,这是1个旧图,网上到处都是,但可以用来理解VMA:
这里写图片描述

上面这幅图会告知我们甚么呢?

内核虚拟内存空间,你肯定访问不了.
用户栈,用户进程启动就会有这样1个结构,你超过它的上界就到了内核虚拟内存空间,就会出现段毛病.
内存映照mmp区域.
堆,malloc、calloc就在这里找地址分配.(事实上不但如此)
代码、数据段 包括全局变量、静态变量、代码、数据等等.

如果你访问了内核虚拟内存空间(就是比ebp大的空间,1都不行)、代码段、数据段都会引发段毛病。

在上篇的例子中,是由于访问了图中红色圈出的保存区域酿成的段毛病

补充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.

我想,对这样1个简单的c程序,上面的信息足够了.
这里写图片描述

其它

或许后面还想看看mmap、mm的fault处理、页异常处理还有signal的1些东西.
但本篇,就此结束.

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡