arm环境使用GDB调试

前言

        调试设备代码的时候,经常碰到程序异常或者功能对不上,以前这种时候就是加打印消息,然后重新编译把程序放进去跑,通过打印消息来判断代码出问题的点在哪里,但是有的时候可能需要反复加多次才能定位到问题点,而使用gdb调试就可以很快找到问题,非常效率,虽然GDB调试的文章已经很多了,但还是想写写来记录一下。

前期工作

        我使用的是主机端使用gdb,设备端使用gdbserver的方式去调试,所以需要在先编译一个arm版本的gdbserver

我所使用的编译器:arm-linux-gnueabihf-gcc

gdb源码版本:gdb-8.3

编译生成的程序我已经上传到我的gitee,如果不想编译的话可以直接下载我的用

arm环境GDB调试: arm环境下使用gdb调试 (gitee.com)

gdbserver编译

        只需要交叉编译gdbserver即可,因为一般你安装的arm编译器是带gdb的,可以查看你的交叉编译器选项,就会发现一般有arm-linux-gnueabihf-gdb这个程序,当然你也可以重新编译一个arm版本的gdb,这个不影响,我实测下来,都可以使用。

进入源码目录,再到gdb-8.3/gdb/gdbserve这个目录下,打开终端,输入命令裁剪

./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf  --prefix=/opt/gdb/gdbserver-lib
# --host:该软件将运行的平台,填你的交叉编译器
# --target:该软件所处理的目标平台,填你的交叉编译器
# --prefix:目标文件生成路径

裁剪完后直接编译安装

make 
make install

最后会在指定目录下生成程序

把这个程序放到arm开发板,如果觉得程序太大了的话,可以执行strip命令,减小程序大小

arm-linux-gnueabihf-strip arm-linux-gnueabihf-gdbserver

GDB调试

我们写一段程序测试一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char buf[] = "hello world";
	char data[100];
	char *data2;
	
	for(int i = 0; i < strlen(buf); i++)
		data[i] = buf[i];
	
	printf("data:%s\n", data);
	
	strcpy(data2, data);
	
	printf("data2:%s\n", data2);
	
	return 0;
}

用arm编译器编译,注意编译的时候加上-g,支持gdb调试

arm-linux-gnueabihf-gcc -o gdbtest test.c -g

接着放到arm开发板使用gdbserver运行

# 执行命令格式为./gdbserver :端口号 程序
./gdbserver :1234 gdbtest

然后在主机先执行命令

arm-linux-gnueabihf-gdb -tui
# -tui 在GDB调试中显示源代码

 进入gdb后,输入指令连接开发板

# 格式 target remote 开发板ip:端口号(端口号需一致)
target remote 10.10.10.174:1234

这时候就可以查看源码打断点进行调试了

输入c直接运行,可以看到程序此时发生了段错误,所以如果实际中编程程序挂掉的话,可以先打断点,然后在单步执行,很快就能定位到段错误的位置。

GDB调试core文件

一般情况下,在开发阶段正常,但是在测试的时候程序就可能挂掉,但是不可能一直开着gdbserver去跑,而且问题不一定好复现,这个时候就要靠core文件去定位问题点了,在运行程序前设置core文件

ulimit -c unlimited
# 设置进程生成core文件的大小限制。将其设置为 "unlimited" 表示不限制core文件的大小,即进程崩溃时可以生成任意大小的core文件
echo '/tmp/core.%e.%p.%t' | tee /proc/sys/kernel/core_pattern
# 生成的core文件会保存在 /tmp 目录下,并以 "core.可执行文件名.进程ID.时间戳" 的格式命名。

然后直接执行执行程序

可以看到,在我指定的目录下,生成了core文件,把这个core文件拷贝到主机,然后执行命令

arm-linux-gnueabihf-gdb gdbtest core.gdbtest.6934.1705905673

然后使用bt命令就可看到段错误的位置了

这样就可以迅速定位到问题点了。

总结

        GDB调试是一个很强大的工具,这里只是简单的讲了一下gdb的用法,还有很多功能,本人也还在继续学习使用。

        希望我的文章可以帮助到你!!!

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对 ARM 架构的调试,你可以使用以下三个版本的 GDB:GDB 6.7、GDB 7.6 和 GDB 8.1 。GDB 是一款 UNIX 及 UNIX-like 下的调试工具,它主要提供了以下四个功能: 1. 启动程序:你可以按照自定义的要求来运行程序。 2. 运行程序:你可以单步执行程序,观察每一步的状态变化。 3. 检查程序状态:你可以查看程序的变量值、寄存器状态等信息。 4. 修改程序状态:你可以修改程序的变量值、寄存器状态等信息。 对于 ARM 架构的调试,你需要在 Linux 服务器上搭建 GDB 服务器。你可以使用以下配置来启动 GDB 服务器: ``` miDebuggerServerAddress: "192.168.225.1:9001" ``` 这里的 IP 地址和端口号是目标板上 GDB 服务器监听的地址和端口号 。另外,在 Visual Studio Code 中也可以配置 GDB 调试。你可以在配置文件中设置以下属性: ``` "configurations": [ { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "/home/user/vscode_gdb/arm_test", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "miDebuggerPath": "/opt/***/arm-oe-linux-gnueabi-gdb" } ] ``` 在以上配置中,你需要指定要调试的程序的完整路径、工作目录和适合目标板的 GDB 路径 。同时,你可以设置其他的调试选项,例如调试环境变量、启用整齐打印等。 总结起来,你可以使用 ARM 架构的 GDB 版本进行调试,可以在 Linux 服务器上搭建 GDB 服务器,也可以在 Visual Studio Code 中配置 GDB 调试选项来进行 ARM 架构的调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值