什么让你对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 (2)的更多相关文章

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

    什么让你对C/C++如此恐惧? 晦涩的语法?还是优秀IDE的欠缺? 我想那都不是问题,最多的可能是一个类似这样的错误: 段错误(Segmentation fault) 这是新手无法避免的错误,也是老手 ...

  2. 你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)(3)

    前言 接上两篇: 你的C/C++程序为什么无法运行?揭秘Segmentation fault (1) 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2) 写到这里,越跟 ...

  3. C#如何防止程序多次运行的技巧

    一.使用互斥量Mutex弄懂了主要的实现思路之后,下面看代码实现就完全不是问题了,使用互斥量的实现就是第四点的思路的体现,我们用为该程序进程创建一个互斥量Mutex对象变量,当运行该程序时,该程序进程 ...

  4. iOS开发小技巧--iOS程序进入后台运行的实现

    iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...

  5. 配置ASP.NET Web应用程序, 使之运行在medium trust

    这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust.   如果你的服务器有多个应用程序, 你可以使用code access security和medium ...

  6. WPF 设置程序开机自动运行(+注册表项)

    #region 设置程序开机自动运行(+注册表项) RegistryKey rgkRun = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Micr ...

  7. 【转】delphi程序只允许运行一个实例的三种方法:

    一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...

  8. inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效

    inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效 inno setup 安装卸载时检测程序是佛正在运行卸载完成后自动打开网页-代码无效 --------------------- ...

  9. .NET概念:.NET程序编译和运行

    .NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...

随机推荐

  1. Nagios Openstack Plugin

    Some simple example for checking Openstack services check nova service list #!/bin/sh export OS_PROJ ...

  2. linux编译警告 will be initialized after

    http://blog.chinaunix.net/uid-17019762-id-3152012.html 作为一个有强迫症的人,实在是受不了 warning 的存在 这个warning是由于初始化 ...

  3. java基础55 UDP通讯协议和TCP通讯协议

    本文知识点(目录): 1.概述    2.UDP通讯协议    3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket.    2.不同的 ...

  4. No.13 selenium for python 单选框和复选框

    单选框 radio 点击图标,可以获取HTML中定位. 使用普通的ID定位就可以了 定位到指定元素,然后使用clicd选中即可 复选框 checkbox 勾选单个框,跟单选框一样,定位后点击就可以了 ...

  5. session的本质及如何实现共享?

    为什么有session? 首先大家知道,http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办 ...

  6. JAVA复习笔记之多线程并发

    前言:多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,还是值得深入研究一下 概念: 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用 ...

  7. const 和 #define区别_fenglovel_新浪博客

    const 和 #define区别 (2012-12-11 14:14:07) 转载▼ 标签: 杂谈   (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使 ...

  8. 开启nginx目录文件列表功能

    ngx_http_autoindex_module  此模块用于自动生成目录列表,ngx_http_autoindex_module只在 ngx_http_index_module模块未找到索引文件时 ...

  9. 如何使用django+celery+RabbitMQ实现异步执行

    1)安装需要安装RabbitMQ.Celery和Django-celeryCelery和Django-celery的安装直接pip就好 2)修改settings.py在INSTALLED_APPS中加 ...

  10. Chrome-Adobe Flash 无法正常使用

    https://support.google.com/chrome/answer/6258784 该网站因是是google.com,被强了,所以一般打不开. 故将google官方说明记录以下: 如果 ...