这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功。没有调试手段比较痛苦,今天又花了点时间,居然搞定了。粗做记录。

工具版本:

1. QtCreator: 2.4.1 based on Qt4.8.0, 32bit

2. arm-linux-gcc: 4.5.1, 从友善之臂的开发光盘上拿来的

3. GDB: gdb-7.6

4. QTE 4.8.5-32bit: 从友善之臂的光盘上抠来的

5. mint13 (操作可参考 ubuntu12.4)

以下工作,是基于友善之臂的开发环境做的。但是应该主要思路是一致的。如下图所示,QtCreator 通过调用 arm-linux-gdb ,与开发板上的 gdb-server 通过 TCP/IP 进行通信,协同完成 bin 文件的调试;二者都使用共同的 symbol 库,QtCreator 负责解析,gdbserver 负责抓取 symbol 和寄存器值。

 

所以,这里需要做的工作就是,需要1)编译出 arm-linux-gdb 以及 2)gdbserver,还有,配置编译出针对板子的3)带 debug 信息的二进制文件。

 

1,2)编译 gdb

1和2是同一个工作,都是从 gdb 源码来编译的,所以,不分开来记录。

首先,下载并解压源码包,得到 gdb 源码目录 /tmp/gdb-7.6.

在 /tmp/gdb-7.6 目录下新建文件夹 __install,做安装文件拷贝目录.

执行 autoconf 脚本,使用如下参数:



./configure --target=arm-linux --disable-tui --prefix=/tmp/gdb-7.6/__install/



make -j && make install

此时,在 /tmp/gdb-7.6/__install/

然后,切换目录到 /tmp/gdb-7.6/gdb/gdbserver/ 下,准备编译 gdbserver。

执行 autoconf 脚本,使用如下参数:



./configure --target=arm-linux --host=arm-linux --prefix=/tmp/gdb-7.6/__install/server/



make -j&&make install

此时,我们在 /tmp/gdb-7.6/__install/server 下发现 bin 和 share 两个文件夹。bin 下面,就是我们需要的,在开发板上运行的 gdbserver,拷贝到板子上就行了。

我们可以尝试用 gdbserver 来运行程序:



$ gdbserver 192.168.1.230:1234 packet_analyzer 
Process packet_analyzer created; pid = 11413
Cannot exec packet_analyzer: Exec format error.

Child exited with status 127
No program to debug.  GDBserver exiting



这是因为这里使用的二进制文件不包含调试信息的缘故,需要编译带 debug 信息的二进制文件才能被 gdb 使用。

 

3) 编译带调试信息的 arm 二进制文件

我是直接对我的 QtCreator 进行了配置,添加了 QtE 4.8.5 的开发环境 和 arm-linux-4.5.1 的路径。截图如下:

qt creator下载 国内镜像 qt creator arm版_linux

qt creator下载 国内镜像 qt creator arm版_linux_02

添加了工具链之后,就可以在工程的 project 页面下,看到下面的选项,在这里添加 debug-build for ARM。

qt creator下载 国内镜像 qt creator arm版_qt creator下载 国内镜像_03

添加这样一个 build 选项后,我们就可以点击 run 生成二进制文件了。

qt creator下载 国内镜像 qt creator arm版_qt creator下载 国内镜像_04

 

4)远程调试

将二进制文件拷到开发板,并使用 gdbserver 执行二进制文件(remote debuging 部分是因为 qtcreator 连过来之后,才打印的):



# gdbserver 192.168.1.230:1234 packet_analyzer 
Process packet_analyzer created; pid = 11460
Listening on port 1234
Remote debugging from host 192.168.1.243
hi 
hello smvSocket 
Compiling packet filter failed! 
do nothing... 
smvProcess::Open(), Open Smv Socket succeed!



在代码中设置断点。

配置 QtCreator->debug->start debuging->attached to remote debug server... ,并配置如下,点击 ok 连接到开发板的 gdbserver。

qt creator下载 国内镜像 qt creator arm版_网络_05

此时,看到 QtCreator 中的代码停在了 我们设置的断点处,单步也可以进行。

qt creator下载 国内镜像 qt creator arm版_运维_06

 

可能还有更方便的方法,待实验。

 

后续...

今天尝试了使用 QtCreator 里面的 device 方式打开调试 gdbserver。主要的时间花费在了找合适版本的 openssh 上,先后试了 openssh7.2p2 , openssh5.3p1, openssh5.8p1。。。最后终于,用 openssh5.8p1 中的 sshd 做服务器,可以让 CtCreator 中的 device 客户端连接上。就是这个版本的服务器反应有点慢,需要把 timeout 时间拉长一点。

device 的配置是在 options 里面进行的,我的如下:

qt creator下载 国内镜像 qt creator arm版_qt creator下载 国内镜像_07

配置好上面的 device,就可以在 debug->start debuging->start remote debug server... 选项卡,打开下面的界面,选择你要调试的进程,QtCreator 会自动的通过 ssh 通道调用 /usr/bin/gdbserver,将 gdbserver attach 到要调试的进程上去(通过 pid attach 到进程)。

qt creator下载 国内镜像 qt creator arm版_运维_08

使用这种方法,我们不用登录到设备内部,手动调用 gdbserver 去打开程序。。。