找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 452|回复: 0
收起左侧

关于Linux调试GDB的一些笔记

[复制链接]
ID:729982 发表于 2024-3-22 15:21 | 显示全部楼层 |阅读模式
在linux环境的开发中我们经常遇到一些问题,他不像在板子上裸机开发那么方便,直接jlink连着就能debug,linux下我们总是通过printf打印来看程序跑到哪里了,或者打印一些变量的实时信息,这种方法简单没门槛,但是每次改点儿东西就要重新编译,编译完后还需要重载程序,非常麻烦
用GNUdebug方法就方便多了,这是一个可以在linux系统下实现代码debug功能的东西,可以打断点,步进运行程序,实时监控变量,栈,甚至可以根据自己的想法实时控制程序往哪跑,唯一美中不足的是linux下没有图形操作界面。

1、想实现GDB,首先要保证开发板和自己的linux虚拟机能通信,通信不上的可以看看我另一篇帖子

2、在官网下载GDB gnu网/software/gdb/download/  下载源码,下载完成后,上存到Ubuntu进行解压,解压完以后编译,并且install。我使用的是7.8.2版本,其实我们从网上下别人的源码库来自己编译,经常会编译报错的,这个时候需要自己进去里面改改代码。我附件会带一个我改好的,不知道咋改的同学可以直接用,当然我更希望大神能调试好更高版本的也分享一下。
解压后进入build目录下执行../configure--target=arm-linux--prefix=/work/tools/gdb
然后执行make,make完以后执行make install 可执行文件会放到/work/tools/gdb/bin下,每次使用gdb的时候需要使用绝对路径启动这个可执行程序,嫌麻烦可以自己配一下环境变量


3、在开发板上移植gdbserver ,gdbserver 是在开发板上运行的,因此要交叉编译
进入gdb-7.8.2/gdb/gdbserver目录
执行../configure--target=arm-linux--host=arm-linux 配置
make CC=arm-linux-gcc交叉编译//这一步各自看看自己的芯片用的哪个交叉编译工具,不兼容的话编出来的东西跑不起来的
交叉编译完后把生成的gdbserver 文件放到开发板文件系统里的/usr/bin目录下
执行gdbserver --version看看成功没有


4、将自己的工程编译的时候加上-g,这样生成的程序才能进行调试


5、gdbserver 192.168.1.12:2001 comprot 在开发板启动gdb调试,地址用自己linux虚拟机的地址,comprot是我自己的工程程序
这里的端口随便填,当然不能和已经被使用的冲突,只要别用常用的那几个就OK


6、虚拟机里启动gdb
/work/tools/gdb/bin/arm-linux-gdb /mnt/hgfs/program/\!ocpp板程序/AAOCPP_MQTT2/Protocol-ocpp_wf3_0/bin/comprot
我用的是绝对路径,后面要带上本地编译的可执行文件


7、在虚拟机启动的gdb命令框里执行target remote 192.168.1.136:2001   
此处的地址是开发板的地址,端口是上面自己设置的端口,要一致


8、如此就启动完成了,执行b main,可以直接在主函数入口打断点,并且命令行会输出打在哪个文件哪一行,自己看看对不对的上



下面附带一些常用的调试指令
GDB调试命令大全

打断点:

b [源代码行号][源代码函数名][内存地址] 任一参数b main 在主函数入口打断点b /mnt/hgfs/program/!ocpp板程序/AAOCPP_MQTT2/Protocol-ocpp_wf3_0/main.c:900  在某文件的某行打断点/条件。例如在循环体中可以设置break ... if i = 100 来设置循环次数

info b 查看打的断电

clear删除一个断点,这个命令需要制定代码行或者函数名作为参数

disable禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数  可以通过info b 看到索引值

Ctrl-C在当前位置停止执行正在执行的程序,断点在当前行

display在断点的停止的地方,显示指定的表达式的值。(显示变量)

list显示10行代码。如果没有提供参数给这个命令,则从当前行开始显示10行代码。如果提供了函数名作为参数,则从函数开头显示。如果提供代码行的编号作为参数,这一行作为开头显示。

list显示10行代码。如果没有提供参数给这个命令,则从当前行开始显示10行代码。如果提供了函数名作为参数,则从函数开头显示。如果提供代码行的编号作为参数,这一行作为开头显示。

load动态载入一个可执行文件到调试器。

next执行下一行的源代码的所有指令。如果是函数调用,则也当作一行源代码,执行到此函数返回

nexti执行下一行的源代码中的一条汇编指令

Print显示变量的值

ptype显示变量的类型

return强制从当前函数返回

run从程序开始的地方执行

设置观察点:

a、watch + [变量][表达式] 当变量或表达式值改变时即停住程序。

b、rwatch + [变量][表达式] 当变量或表达式被读时,停住程序。

c、awatch + [变量][表达式] 当变量或表达式被读或被写时,停住程序。
3E56EB43-201F-4d40-A97D-0965EFCDBAEA.png

gdb-7.8.2.tar.7z

18.38 MB, 下载次数: 0

自己解压

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表