这里使用的 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/ 目录下,看到有 bin、lib、include 等文件夹。将这 3 个文件夹下的内容拷贝到 toolchain/4.8.5/arm-linux-eabui/ 对应目录下。
然后,切换目录到 /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 的路径。截图如下:
添加了工具链之后,就可以在工程的 project 页面下,看到下面的选项,在这里添加 debug-build for ARM。
添加这样一个 build 选项后,我们就可以点击 run 生成二进制文件了。
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。
此时,看到 QtCreator 中的代码停在了 我们设置的断点处,单步也可以进行。
可能还有更方便的方法,待实验。
后续...
今天尝试了使用 QtCreator 里面的 device 方式打开调试 gdbserver。主要的时间花费在了找合适版本的 openssh 上,先后试了 openssh7.2p2 , openssh5.3p1, openssh5.8p1。。。最后终于,用 openssh5.8p1 中的 sshd 做服务器,可以让 CtCreator 中的 device 客户端连接上。就是这个版本的服务器反应有点慢,需要把 timeout 时间拉长一点。
device 的配置是在 options 里面进行的,我的如下:
配置好上面的 device,就可以在 debug->start debuging->start remote debug server... 选项卡,打开下面的界面,选择你要调试的进程,QtCreator 会自动的通过 ssh 通道调用 /usr/bin/gdbserver,将 gdbserver attach 到要调试的进程上去(通过 pid attach 到进程)。
使用这种方法,我们不用登录到设备内部,手动调用 gdbserver 去打开程序。。。(感觉好鸡肋 囧RZ)