linux环境下使用Vscode gdb/gdbserver调试Segmentation fault问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

功能开发时,调试出现Segmentation fault,总结已掌握的gdb调试技巧及经验于本文,下面这段是示例代码gdb方便调试,代码在释放内存后,再去访问该内存第17行,因此出现了Segmentation fault

#include <stdio.h>
#include <stdlib.h>
#define NUM_CH 8
int main(int argc,int **argv)
{
  char *test_str = (char *)malloc(NUM_CH*sizeof(char));
  char *test_str_n = test_str;
  int num = NUM_CH;
  while(num > 0){
    num --;
	*(test_str+num) = 0x30+num;
    printf("hello world: %d\r\n",num);
  }
  printf("test_str:%s\r\n",test_str);
  free(test_str);
  test_str=NULL;
  *(test_str) = 'i';
  return 0;
}

一、使用gdb本地调试不依赖ide定位

1.内存访问越界或空指针

gcc -g gdb_test.c -o gdb_test
gdb ./gdb_test
在这里插入图片描述
gdb调试结果上看,看出在17行异常

2.野指针调试

如果代码出现野指针,代码运行是不会报错,但会隐藏bug,这样可以加-fsanitize=address -fno-omit-frame-pointer -O1 -g参数,代码段只改了17行,指向内存已被释放,再去访问野指针

gcc -fsanitize=address -fno-omit-frame-pointer -O1 -g gdb_test.c -o gdb_test

#include <stdio.h>
#include <stdlib.h>
#define NUM_CH 8
int main(int argc,int **argv)
{
  char *test_str = (char *)malloc(NUM_CH*sizeof(char));
  char *test_str_n = test_str;
  int num = NUM_CH;
  while(num > 0){
    num --;
	*(test_str+num) = 0x30+num;
    printf("hello world: %d\r\n",num);
  }
  printf("test_str:%s\r\n",test_str);
  free(test_str);
  test_str=NULL;
  *(test_str_n) = 'i';
  return 0;
}

在这里插入图片描述

3.远程gdbserver调试

1.确保目标机已有gdbserver ,172.20.1.22为目标机ip

gdbserver 172.20.1.22:6666 ./gdb_test

目标机

2.连接目标机PC主机,能ping通目标机,主机操作如下:

主机环境运行目标机的gdb (aarch64-linux-gdb )
输入target remote 172.20.1.22:6666
接着continue输入c
bt查看堆栈信息
主机

3.测试结果如下,同样测试出17行异常
测试结果

二、基于Vscode使用gdbserver调试

1.使用gdbserver远程调试目标机

主机(172.20.1.170) --------- 目标机(172.20.1.22)
附件: vscode_debug.tar.gz 包含gdb、可执行程序、.vscode工程文件(launch.json)
launch.json需要注意3个箭头program & miDebuggerPath & miDebuggerServerAddress的路径
launch.json

step1.目标机操作

gdbserver 172.20.1.22:6666 ./gdb_test

step2.主机操作
解压上述附件压缩文件vscode_debug.tar.gz

tar -xvf vscode_debug.tar.gz
cd vscode_debug
code .

打开vscode后,点击下图箭头所指的甲壳虫,再点击C++ launch 箭头按钮
在这里插入图片描述
在这里插入图片描述

step3.调试结果
在这里插入图片描述
gdb调试结果上看,同样看出在17行异常

2.目标机生成coredump分析

附件: vscode_debug.tar.gz 包含gdb、coredump文件、可执行程序、.vscode工程文件(launch.json)
launch.json需要注意3个箭头program & miDebuggerPath & gdb & coredump 路径
在这里插入图片描述
step1.目标机操作

ulimit -c unlimited
./gdb_test
此时该目录生成core文件,拷贝到主机目录coredump

step2.主机操作
解压上述附件压缩文件vscode_debug.tar.gz

tar -xvf vscode_debug.tar.gz
cd vscode_debug
code .

打开vscode后,点击下图箭头所指的甲壳虫,再点击Debug Core Dump 箭头按钮
在这里插入图片描述

step3.调试结果
在这里插入图片描述
coredump调试结果上看,同样看出在17行异常

总结

以上就是今天要讲的内容,本文仅仅简单介绍了gdb/gdbserver的使用,以及基于ide界面调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值