zoukankan      html  css  js  c++  java
  • 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)

    什么让你对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的一些东西.
    但本篇,就此结束.

    【版权所有@foreach_break】 【博客地址 http://www.cnblogs.com/foreach-break】 可以转载,但必须注明出处并保持博客超链接
  • 相关阅读:
    分布式事务中间件你知道哪些?
    SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4构建你的微服务体系
    Nginx用做静态资源服务器和动静分离
    物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
    物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
    impala
    impala
    impala
    impala
    代码中的禅机
  • 原文地址:https://www.cnblogs.com/foreach-break/p/4471225.html
Copyright © 2011-2022 走看看