这里使用的 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 的路径。截图如下:

QT Creator 环境使用 remote debug 调试 arm 程序

QT Creator 环境使用 remote debug 调试 arm 程序

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

QT Creator 环境使用 remote debug 调试 arm 程序

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

QT Creator 环境使用 remote debug 调试 arm 程序

 

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 环境使用 remote debug 调试 arm 程序

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

QT Creator 环境使用 remote debug 调试 arm 程序

 

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

 

后续...

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

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

QT Creator 环境使用 remote debug 调试 arm 程序

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

QT Creator 环境使用 remote debug 调试 arm 程序

使用这种方法,我们不用登录到设备内部,手动调用 gdbserver 去打开程序。。。(感觉好鸡肋 囧RZ)

相关文章:

  • 2021-11-11
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2021-06-03
  • 2021-07-20
  • 2022-12-23
  • 2021-08-01
猜你喜欢
  • 2021-07-25
  • 2022-12-23
  • 2021-11-23
  • 2021-06-16
  • 2022-12-23
  • 2021-06-12
  • 2021-06-26
相关资源
相似解决方案