zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言开发过程中段错误处理方法之经典

C语言方法经典开发 过程 错误处理
2023-09-14 09:13:23 时间

     

目录

第一:访问不存在的内存地址

第二:访问只读的内存地址

第三:代码栈溢出

 第四: 内存越界分析

 第五:段错误的调试方法


    在C语言实际开发过程中,大家可能会遇到段错误,这种错误也是一种常见的错误,那么,段错误是如何产生的?可能的原因有段错误是因为访问不可访问的内存产生的。    

    下面是一些典型的段错误产生的原因:

  • 访问不存在的内存地址

  • 访问只读的内存地址

  • 栈溢出

  • 内存越界

第一:访问不存在的内存地址

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");

    int *p = NULL;
    *p = 1234;

    return 0;
}

第二:访问只读的内存地址

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test1==================\n");

    char *str = "hello";
    str[0] = 'H';

    return 0;
}

 

第三:代码栈溢出

#include <stdio.h>

static void test(void)
{
    char buf[1024 * 1024] = {0};
    static int i = 0;
    i++;
    printf("i = %d\n", i);
    test();
}

int main(int argc, char **argv)
{
    printf("==================segmentation fault test2==================\n");

    test();

    return 0;
}

 第四: 内存越界分析

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test3==================\n");

    static char arr[5] = {0, 1, 2, 3, 4};

    printf("arr[10000] = %d\n", arr[10000]);

    return 0;
}

 第五:段错误的调试方法

      从上面的几个例子中,我们应该对段错误有了一定的认识,但实际项目中,实际中,段错误可能没有上面的例子那么明显看出。如果之前没有这方面的经验,可能一时半会也定位不到问题。

     1、使用gdb一步步运行

 

使用gdb调试,打一些断点、按流程运行下去,运行到段错误的地方会直接提示报错。

或者使用命令行直接gdb调试:

总结:不管是在x86上,还是在ARM上都可以使用gdb的调试方法,将对应错误的地方找出来。