C开发中segfault的三种调试方法嵌入式C开发,或多或少遇到过段错误(segmentationfault)。分段错误是一种比总线错误更常见的错误类型。段错误是如何发生的?段错误是由访问不可访问的内存引起的。下面是一些典型的段错误原因:访问不存在的内存地址访问只读内存地址栈溢出内存越界...Segmentationfaultinstance1,实例1:访问不存在的内存地址#includeintmain(intargc,char**argv){printf("====================段错误测试==================\n");int*p=NULL;*p=1234;return0;}2.例子2:访问只读内存地址#includeintmain(intargc,char**argv){printf("====================段错误测试1=====================\n");char*str="你好";str[0]='H';return0;}3.示例3:堆栈溢出#includestaticvoidtest(void){charbuf[1024*1024]={0};静态整数i=0;我++;printf("i=%d\n",i);test();}intmain(intargc,char**argv){printf("===================段错误test2====================\n");测试();return0;}4,例4:内存越界#includeintmain(intargc,char**argv){printf("===============================================================================================================================================================================================================================================\n");静态字符arr[5]={0,1,2,3,4};printf("arr[10000]=%d\n",arr[10000]);返回0;}段错误错误调试方法从上面的例子中,我们应该对段错误有一定的了解,但是在实际的项目中,实际上,段错误可能没有上面的例子那么明显。如果之前没有这方面的经验,可能是一时半会找不到问题所在。下面介绍三种段错误的调试方法,供大家参考。我们还是用例子来说明,例子:#includestaticvoidfunc0(void){printf("Thisisfunc0\n");int*p=NULL;*p=1234;}staticvoidfunc1(void){printf("这是func1\n");func0();}intmain(intargc,char**argv){printf("==================段错误test4====================\n");func1();return0;}1.一步步运行gdb使用gdb调试打一些断点,按照流程运行,当运行到段错误时,会直接提示错误。或者使用命令行直接用gdb调试:这里我们运行的是x86,如果我们针对的是arm嵌入式linux程序,怎么办呢?也可以使用gdb,可以参考我们之前分享的文章:VSCode+gdb+gdbserver远程调试ARM程序2、通过core文件Linux下,程序崩溃时,一般会在指定目录下生成一个core文件.core文件只是一个内存映像(加上调试信息),主要用于调试。可以打开和关闭核心文件。相关命令:ulimit-c#检查core文件是否打开ulimit-c0#禁止生成core文件ulimit-cunlimited#设置core文件大小为无限制ulimit-c1024#限制生成的core文件大小core文件到不超过1024KB0就代表关闭了。下面我们打开:运行程序时,当程序崩溃时,会在程序目录下生成一个core文件,如:debugcore文件:gdbtestcore3,使用backtrace进行分析#include#include#include#includevoidfunc0(void){printf("这是func0\n");int*p=NULL;*p=1234;}voidfunc1(void){printf("这是func1\n");func0();}voidfunc2(void){printf("这是func2\n");func1();}voiddump(intsigno){void*array[100];size_t尺寸;字符**字符串;大小=回溯(数组,100);strings=backtrace_symbols(数组,大小);printf("获得%zd个堆栈。\n",size);for(inti=0;i