这里使用的 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: packet_analyzer
Process packet_analyzer created; pid =
Cannot exec packet_analyzer: Exec format error. Child exited with status
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: packet_analyzer
Process packet_analyzer created; pid =
Listening on port
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)

QT Creator 环境使用 remote debug 调试 arm 程序的更多相关文章

  1. 【Qt开发】Qt Creator在Windows上的调试器安装与配置

    Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...

  2. Qt Creator下应用CMake项目调试mex文件

    网上可以找到很多应用Visual Studio编写.编译mex文件,并与MATLAB联合调试的文章.但这只限于Win平台,网上许多源码都是.mexa64的文件,它们的作者是怎么调试的呢?这里我介绍一下 ...

  3. Qt Creator在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  4. 在QEMU中调试ARM程序【转】

    转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...

  5. [Qt Creator 快速入门] 第5章 应用程序主窗口

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  6. 在vscode中怎样debug调试go程序

    随着互联网时代的飞速发展,我们编码使用的开发利器也在不断更新换代,古话说工欲善其事必先利其器,对于Java开发者而言,eclipse和idea这两款神器各有千秋,因自己的爱好可以选取不同的IDE,但是 ...

  7. 【转】Qt Creator在Windows上的调试器安装与配置

    https://www.librehat.com/qt-creator-on-windows-debugger-installation-and-configuration/

  8. Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序

    Part1 环境搭建和工具安装 1.1 设置交叉编译环境 安装相关的编译工具: sudo apt-get install build-essential gcc-arm-linux-gnueabi 这 ...

  9. eclipse debug调试java程序的九个技巧

    九个技巧: 逻辑结构 条件debug 异常断点 单步过滤 跳到帧 Inspect expressions display 远程debug 最早开始用eclipse的debug的时候,只会F5 F6 F ...

随机推荐

  1. JAVA变成把一个整数分解成多个质数的积

    /* * TestTengXun.java * Version 1.0.0 * Created on 2017年12月2日 * Copyright ReYo.Cn */ package reyo.sd ...

  2. ios成长之每日一遍(day 3)

    今天要介绍一下更多的控键使用, 当然也会对上一篇说的控件做一个巩固, 所以这一篇涉及到的控键会包括 UIImage.UITextField.UIButton.UILabel.UISwitch.以及 U ...

  3. Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解

    1. 闭锁:CountDownLatch 1.1 使用场景 若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁. 1.2 代码实现 // 初始化闭锁,并设 ...

  4. 安卓调试桥(ADB)环境变量的配置

    第一步,打开环境变量配置窗口.右击计算机,属性-高级系统设置-环境变量. 第二步,添加android系统环境变量.在系统变量下点击新建按钮,输入环境变量名ADB(自己随便写)           变量 ...

  5. 选中TreeView的某节点,并加背景颜色

    一:按钮事件,遍历所有节点 private void button2_Click(object sender, EventArgs e) { foreach (TreeNode n in TreeVi ...

  6. .Net Excel操作之NPOI(二)常用操作封装

    一.Excel数据导出常用操作 1.指定表头和描述 2.指定数据库中读出的数据集合 二.ExcelExport封装 /// <summary> /// Excel常用的表格导出逻辑封装 / ...

  7. 100base-T

    100Base-T是一种以100Mbps速率工作的局域网(LAN)标准,它通常被称为快速以太网标准,并使用两对UTP(非屏蔽双绞线)铜质电缆. 快速以太网 : 与10BASE-T的区别在于网络速率是1 ...

  8. org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.xugao.bean.MemberLevel.memberpointrate

    由于数据不合法的原因,好几次遇到: org.hibernate.PropertyAccessException: Null value was assigned to a property of pr ...

  9. 【BZOJ】【4144】【AMPPZ2014】Petrol

    最短路+最小生成树+倍增 图论问题中综合性较强的一题= =(Orz vfk) 比较容易发现,关键的还是有加油站的这些点,其他点都是打酱油的. 也就是说我们重点是要求出 关键点之间的最短路. 这玩意…… ...

  10. 【ContestHunter】【弱省胡策】【Round6】

    KMP/DP+树链剖分+线段树/暴力 今天考的真是……大起大落…… String QwQ题意理解又出错了……(还是说一开始理解了,后来自己又忘了为什么是这样了?) 反正最后的结果就是……我当成:后面每 ...