提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
功能开发时,调试出现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的路径
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界面调试。