zoukankan      html  css  js  c++  java
  • QT Creator 环境使用 remote debug 调试 arm 程序

    这里使用的 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)

  • 相关阅读:
    babel6的babel-plugin-add-module-exports插件
    babel ---- presets字段设定转码规则
    Babel6.x的安装过程
    npm
    JavaScript的数组
    JavaScript的数据类型
    JavaScript
    数据类型详解
    jsp笔记总结
    Servlet学习总结
  • 原文地址:https://www.cnblogs.com/pied/p/6526969.html
Copyright © 2011-2022 走看看