完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. GDB 简介
gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。对于一般的Linux桌面系统(例如,ubuntu、centos等),我们可以直接运行gdb来调试程序。但嵌入式系统中的芯片性能较弱,无法直接运行gdb调试程序。所以,嵌入式系统一般在PC端运行gdb工具,源码也放在PC端,源码对应的可执行程序放在开发板运行。那么在调试程序时,开发板如何与PC段通信呢?这需要在开发板运行gdbserver,通过网络与PC端进行通信。因此,在搭建GDB调试环境,需要我们在PC端安装gdb用具、移植gdbserver到开发板。 2. 本实验使用的平台环境
由于系统安装的arm-linux-gcc 4.4.3交叉编译器没有自带gdb和gdbserver,所以需要另外安装、移植gdb和gdbserver工具。 3.1 获取gdb和gdbsevver源码 我们可以在gdb的官网上获取源码,地址为http://www.gnu.org/software/gdb/download/,下载源码gdb-7.10.tar.xz,下载完成后,上存到Ubuntu进行解压:解压命令如下: tar vxf gdb-7.10.tar.xz 解压完成后就会得到一个名为gdb-7.10的文件夹,该文件夹就包含了gdb和gdbserver的源码,其中gdb-7.10/gdb/gdbserver目录就是gdbserver的源码。 3.2 编译gdb 首先编译 gdb, gdb 是运行在 PC 端的程序, gdb 编译的时候需要进行配置,配置项如下:
cd gdb-7.10/ //进入gdb源码目录mkdir build //在 gdb 源码下新建 build 目录, gdb 编译比较奇葩!不能直接在 gdb 源码目录下进行配置和编译, //必须新建一个文件夹,然后在此文件夹下配置和编译,切记!cd build/ //进入到刚刚创建的 build 目录下../configure --target=arm-linux --prefix=/work/tools/gdb //配置gdb,配置完成后,会在build目录下生成Makefile文件。make //编译make install //安装 编译、安装完成后,gdb工具会被安装到gdb/bin目录下,名字为arm-linux-gdb,如下图所示: 在上述的目录下运行arm-linux-gdb,命令如下: ./arm-linux-gdb 运行结果如下: 从上图可看出,arm-linux-gdb的版本为7.10,说明安装成功,输入q可以退出gdb工具。 3.3 修改环境变量 前面我们只能在gdb/bin目录下运行arm-linux-gdb工具,为了能够在任意命令行中都可以运行arm-linux-gdb工具,需要修改系统PATH环境变量的值,把arm-linux-gdb工具所在的目录路径添加到PATH环境变量。 (1) 打开/etc/profile文件: vim /etc/profile //打开 (2) 添加/etc/profile最后添加: export PATH=$PATH:/work/tools/gdb/bin (3) 生效修改过的/etc/profile文件: source /etc/profile 此时我们就可以使用arm-linux-gdb命令工具了。 4. gdbserver移植 接下来移植 gdbserver, gdbserver 是在开发板上运行的,因此要交叉编译。gdbserver的源码保存在gdb-7.10/gdb/gdbserver目录下,进入此目录,然后输入如下命令配置并编译: cd gdb-7.10/gdb/gdbserver //进入gdbserver源码目录./configure --target=arm-linux --host=arm-linux //配置make CC=arm-linux-gcc //交叉编译 gdbserver 交叉彼岸完成后,会在该目录下生成一个名为gdbserver的文件,这个文件就是我们需要放到开发板上去的gdbserver,如下图所示: 把上图交叉编译出来的 gdbserver 软件发送到开发板中的/usr/bin 目录下,完成以后在开发板中输入如下命令查看 gdbserver 版本号: gdbserver --version 如果 gdbserver 移植成功的话就会打印出其版本号,如下图所示: 5. 使用 GDB 进行嵌入式程序调试 5.1 编写一个测试应用程序 (1) 编写一个简单的测试软件,命名为test.c,然后使用gdb工具来调试这个程序。test.c的内容如下: #include arm-linux-gcc -o test test.c -g 编译完成后,把编译出来的test可执行问发送到开发板中。 5. 2 使用GDB调试程序 (1) 在开发板启动gdbsever,连接PC端(这里的PC端是指ubuntu),命令如下: gdbsever 192.168.0.107:2001 test 在上面的名字中,
(2) 在PC端启动arm-linux-gdb,并连接开发板,命令如下: arm-linux-gdb test 打印信息如下: 上图最下面的(gdb)行用于输入命令,输入如下命令,连接上开发板: target remote 192.168.0.200:2001 在上面的命令中:
5.3 gdb 调试命令 (1) l 命令 l 命令(list)用于列出所有程序源码,输入“l”,结果如下图所示: 注:如果源码没有打印完,重复输入“l”命令,可以继续接着打印源码;按下回车(enter)键,可重复上一命令。 (2) b 命令 b 命令(break)用于设置断点,也可以用缩写“b”,后面可以跟具体的函数或者行号。例如:“break main”表示在 main 函数处设置断点,“break 11”在第 11 行设置断点。在main函数设置断点: b main 设置完成后,提示如下图所示: (3) c 命令 c 命令用于运行到断点出,输入 c 命令程序就会运行,直到下一个断点处,如下图所示: 继续输入“c”命令,程序就好持续不断的运行,如下图所示,当然,这是因为后面没有设置断点。 (4) s 命令 s 命令(step)是单步运行执行,此命令会进入到函数里面。 (5) n 命令 n 命令(next)也是单步运行,但是 n 命令不会进入到函数里面。 (6) p 命令 p 命令(print)用于打印某个变量值。 (7) q 命令 q 命令(quit)用于退出调试,开发板上的 gdbserver 也会停止。 最后,更多的gdb命令,可查看GDB常用命令大全 GDB 命令详细解释。 |
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1105 浏览 1 评论
2473 浏览 5 评论
2807 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2645 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
652浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 18:51 , Processed in 0.979735 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号