|
在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 + [变量][表达式] 当变量或表达式被读或被写时,停住程序。
|
评分
-
查看全部评分
|