gdb+gdbserver远程调试技术(一)——调试环境搭建
来源:互联网 发布:python yield 编辑:程序博客网 时间:2024/05/21 15:50
对于软件开发来说,调试程序是比不可少的。对于开发PC软件通常系统已经继承了调试工具(比如Linux系统的GDB),或者IDE直接支持对程序的调试。而对于开发嵌入式软件来说调试的手段比较有限,很多开发者仅有的调试手段依然是最原始的打印(我也是其中之一)。当然除了打印调试之外还有通过gdb+gdbserver来调试,gdbserver在目标系统中运行,gdb则在宿主机上运行。
一、源码下载
对于嵌入式软件开发调试工具没有现成的,且嵌入式系统比较繁杂,gdbserver需要根据目标系统单独编译。gdb的源码包下载地址为:http://ftp.gnu.org/gnu/gdb/。目前最新的版本为8.0但由于8.0加入了C++11,而我的目标系统的交叉工具链不支持C++11,故下载7.12版本。
二、编译arm-linux-gdb
Linux系统本身已经自带gdb工具,但无法用在嵌入式调试中,需要单独编译arm-linux-gdb
。
1.解压源码包
$ tar zxvf gdb-7.12.tar.gz $ cd gdb-7.12/
2.生成Makefile
$ ./configure --target=arm-linux --prefix=$PWD/__install
–target:指定目标平台。–prefix:指定安装路径。
3.编译
$ make
4.安装
$ make install
执行此命令后会在当前目录下生成文件夹__install/里面包含可执行文件、头文件、动态库文件等,如下图所示:
目前只用到bin/目录下的可执行文件arm-linux-gdb,执行下面命令:
$ sudo cp __install/bin/arm-linux-gdb /usr/bin/
将生成的arm-linux-gdb文件拷贝到系统/usr/bin/目录下,这样便可以在任何地方很方便的调用。
三、编译gdbserver
1.生成Makefile
$ cd gdb/gdbserver/$ ./configure --target=arm-linux --host=arm-linux-gnueabi
–host:指定交叉工具链,arm-linux-gnueabi
为我的目标系统的交叉工具链。
2.编译
$ make
编译gdbserver不需要执行make install
命令,make
之后在当前目录下会生成可执行程序gdbserver
,将其拷贝到目标系统中。
四、可能出现的问题
1.GDB7.6 Remote ‘g’ packet reply is too long错误
在gdb调试过程中可能出现如下图所示错误:
解决方案:
修改gdb/remote.c文件,屏蔽process_g_packet函数中的下列两行:
if (buf_len > 2 * rsa->sizeof_g_packet) error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
在其后添加:
if (buf_len > 2 * rsa->sizeof_g_packet) { rsa->sizeof_g_packet = buf_len ; for (i = 0; i < gdbarch_num_regs (gdbarch); i++) { if (rsa->regs[i].pnum == -1) continue; if (rsa->regs[i].offset >= rsa->sizeof_g_packet) rsa->regs[i].in_g_packet = 0; else rsa->regs[i].in_g_packet = 1; } }
2.arm-linux-gdb加载目标系统库出错
arm-linux-gdb在调试的时候会加载目标系统的库文件,如果出错时便无法调试,如下图所示:
解决方案
可通过指令[set solib-search-path+库文件路径]来手动加载目标系统库文件,如下为我的设置:
(gdb) set solib-search-path /home/zxd/MerriiLinux_qa1_qe1/boot/config/gcc-linaro/arm-linux-gnueabi/libc/lib/
五、调试
下面给出调试用的示例代码:
test.c
#include <stdio.h>int main(void){ int i; for (i=0; i<5; i++) { printf("Hello World:%d\n", i); } printf("Good bye!\n"); return 0;}
1.编译用于调试的程序
$ arm-linux-gnueabi-gcc -g test.c -o test
为了能够gdb调试,在编译程序的时候必须加-g选项,将生成的可执行文件test拷贝到目标板中。
2.环境配置
宿主机IP:192.168.0.139
目标板IP:192.168.0.138
3.目标板上运行gdbserver
# cd /# gdbserver 192.168.0.139:6666 /test
其中 192.168.0.139 是宿主机的地址,6666是调试端口,helloword是需要调试的可执行程序。gdbserver启动之后打印出下面内容:
4.宿主机上运行arm-linux-gdb
$ arm-linux-gdb test
arm-linux-gdb
启动之后会有如下打印:
其中最后一行(gdb) 表示arm-linux-gdb
在等待输入指令,现在需要输入指令来连接gdbserver,如下所示:
(gdb) target remote 192.168.0.138:6666
输入上述指令若成功连接目标板会打印出下图所示:
宿主机会打印出如下图所示:
5.指定库文件路径
由上图可知arm-linux-gdb
加载目标系统库文件成功,如果失败需要手动加载,下面给出对于我的目标板的指令:
(gdb) set solib-search-path /home/zxd/MerriiLinux_qa1_qe1/boot/config/gcc-linaro/arm-linux-gnueabi/libc/lib/
6.调试
下面给出调试结果,具体调试方法跟PC机上gdb调试类似,只是在设置断点后,gdb通过run/r
指令让程序运行。而对于嵌入式系统来说程序已经通过gdbserver运行了,arm-linux-gdb通过continue/c
让程序继续运行,下面为调试结果:
其中左侧的为目标开发板通过串口终端打印出来的,右边窗口为通过ssh连接宿主机的终端。
- gdb+gdbserver远程调试技术(一)——调试环境搭建
- gdb+gdbserver远程调试技术
- arm-linux-gdb+gdbserver环境搭建以及远程调试
- arm-linux-gdb+gdbserver环境搭建以及远程调试
- gdbserver + gdb 远程调试
- 配置GDB+GdbServer远程调试环境
- 配置GDB+GdbServer远程调试环境
- gdb+gdbserver远程调试技术(二)解决segmentation-fault
- 2440 中 gdb gdbserver 调试环境搭建
- arm-linux-gdb+gdbserver环境搭建以及远程调试 及调试core文件
- arm-linux-gdb+gdbserver环境搭建以及远程调试 及调试core文件
- GDB远程调试(一)之DM8168下gdb远程调试环境的搭建
- GDB远程调试(一)之DM8168下gdb远程调试环境的搭建
- utu2440 gdbserver 远程调试环境搭建
- gdb + gdbserver 远程调试(应用程序)
- 嵌入式调试中gdb+gdbserver 调试环境搭建
- eclipse gdb gdbserver 远程调试
- GDB+Gdbserver ARM远程调试
- 30分钟掌握ES6/ES2015核心内容(上)
- Web前端性能优化
- 文章标题
- 统计字符(去哪儿2017校招真题)
- strpos 细节
- gdb+gdbserver远程调试技术(一)——调试环境搭建
- 调用系统分享功能
- 交叉熵代价函数(cross-entropy)
- 【JAVA】Maven项目配置jdk版本以及tomcat插件的代码
- 自动列表分区
- 模拟退火算法解决TSP(旅行商)问题
- 30分钟掌握ES6/ES2015核心内容(下)
- qt之加载资源文件(qss)
- yii2安装 docker+debian8