qt远程调试ARM板

2023-05-16

  1. 前期准备
    使用qt5.8调试
    pc机必须能与arm板ssh通信。
    先查看pc版本的gdb以及gdb使用到python(注意:qt3.1之后调试需要python)
    查看gdb版本:可通过qtcreator查看(tool->options->build&run->debuggers),如下图红色矩形区域

    查看gdb使用的python版本,由上图找到gdb文件目录,打开它。使用ldd命令查看,可以发现,gdb使用的python3.5版本如下图:

    好了,摸清我们pc端使用的gdb版本和python,我们就开始配置安装吧。为什么要有这个前期准备,因为qt调试必须要使用对应的python版本(本人曾编译python2.7版本,结果用qt调试的时候看不到调试信息)

gdb安装
0.下载gdb-7.11.1.tar.gz(http://www.gnu.org/software/gdb/download/)手动到网页下载

1、将gdb-7.11.tar.gz拷贝到任意的位置

2、解压gdb-7.11.1.tar.gz

tar -zxvf gdb-7.11.1.tar.gz

3、编译arm-linux-gdb(gdb client)(下面/usr/local是安装目录,可自行更改)

到目录gdb-7.7.1下

cd gdb-7.7.1

. / c o n f i g u r e − − t a r g e t = a r m − l i n u x − − p r e f i x = / u s r / l o c a l / a r m − g d b 7.11.1 − − w i t h − p y t h o n ( 注 意 , 执 行 该 命 令 之 前 , 首 先 要 确 认 , 本 地 p y t h o n 是 什 么 版 本 , 如 下 图 , 先 使 用 w h i c h p y t h o n 查 看 当 前 使 用 的 版 本 , 我 们 看 到 是 2.7 版 本 , 不 是 我 们 需 要 的 , 所 以 使 用 w h e r e i s p y t h o n 命 令 查 看 本 机 的 所 以 p y t h o n 版 本 , 我 们 看 到 在 3.5 版 本 也 有 安 装 ( 安 装 目 录 / u s r / b i n ) , 若 没 有 安 装 , 则 需 要 下 载 安 装 ) ! [ ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / i m g c o n v e r t / 8 f 27 f 6 a 6 d 56 f 52 b 2049459156 b 1146 a 1. p n g ) 接 下 来 我 们 需 要 把 当 前 的 p y t h o n 换 成 3.5 , 使 用 如 下 命 令 : e x p o r t P A T H = / u s r / b i n / : ./configure --target=arm-linux- -prefix=/usr/local/arm-gdb7.11.1 --with-python(注意,执行该命令之前,首先要确认,本地python是什么版本,如下图,先使用which python 查看当前使用的版本,我们看到是2.7版本,不是我们需要的,所以使用whereis python 命令查看本机的所以python版本,我们看到在3.5版本也有安装(安装目录/usr/bin),若没有安装,则需要下载安装) ![](https://img-blog.csdnimg.cn/img_convert/8f27f6a6d56f52b2049459156b1146a1.png) 接下来我们需要把当前的python换成3.5,使用如下命令:export PATH=/usr/bin/: ./configuretarget=armlinuxprefix=/usr/local/armgdb7.11.1withpython(python,使whichpython使2.7使whereispythonpython3.5/usr/bin)![](https://imgblog.csdnimg.cn/imgconvert/8f27f6a6d56f52b2049459156b1146a1.png)python3.5使exportPATH=/usr/bin/:PATH,在查看下当前python版本就变成3.5的了

target指明编译生成的GDB用于调试ARM-LINUX程序,prefix指明安装目录

–with-python将python模块编译进来。因为QT creator3.1版本开始,调试必须有Python功能。

Ubuntu自带Python。位于/usr/bin/。
$make

如果make出现如下错误

checkint for python3.5... /usr/bin/python3.5  
checkint for python3.5... no  
configure: error: no usable python found at python3.5  

则需要在执行apt-get install python3.5-dev(因为c++调用python是通过dev的)。安装完成后重新configure再执行make。
若出现Python:未定义符号:pyunicodeucs2_decode等类似的错误(字符编码问题),则在编译使用如下选项:–enable-unicode=ucs4,在编译。如果还是出现相同错误,则需要自己下载对应的python版本编译安装,我就是出现这样问题,文末有python安装过程。
#make install
执行完毕后,可在安装目录下,看到生成的二进制文件,如下图

4、编译gdb server

#cd ./gdb/gdbserver (进入gdb-7.7.1目录里执行该句)

#./configure --host=arm-buildroot-linux-gnueabihf --prefix==/usr/local/arm-gdb7.11.1 /server
这里一定要指定生成主机目标(因为gdbserver要在arm下跑的)
#make -j8 && make install
假若出现一些werror的错误(警告信息当作错误处理),则输入如下命令./configure --disable-werror然后再make就行
执行完毕后,可在安装目录下,看到生成的二进制文件,如下图

准备调试
1.将arm-linux-gdbserver 拷贝到ARM板子的系统bin目录,并重命名未gdbserver(一定要拷贝到系统bin目录否则会出现如下情况)
2. 然后配置qt构建套
1)首先添加gdb调试器,如下图点击添加,浏览我们之前生成的arm-linux-gdb,设置即可,如下图

2)然后给arm版本的qt,添加步骤1)添加的调试器,如下图

这样就添加成功了。
3.配置远程设备
1)添加设备,tool->options->devices->add->gener…device->start wizard,按着向导,输入Ip,用户,密码

然后测试是否可以远程连接到arm板,测试成功如下:
这里写图片描述
2)配置本地生成的二进制文件传送到arm板子,在pro文件添加如下命令,其中/usr/ics是我们本地生成的文件传送到arm的目录

4.启动调试
随便打开一个qt应用程序,编译arm版本。点击调试,如果成功出现如下图
这里写图片描述
如果加载动态库失败或者位置无法定位,则需要手动指定符号库位置(是我们交叉编译arm版本qt的系统路径),如下图

python安装

$ wget -c https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz  
$ tar -xzvf Python-3.5.2.tgz  
$ cd Python-3.5.2/  
$  ./configure  --prefix=/usr/local/python --enable-shared --enable-unicode=ucs2 LDFLAGS="-L/usr/lib/x86_64-linux-gnu"
$ make  
$ sudo make install   

其中, 上面的wget -c (url)是下载命令,参数-c表示支持断点下载, url是目标文件下载的绝对路径

“-L/usr/lib/x86_64-linux-gnu”中的x86_64-linux-gnu在/usr/lib/下可以找到, 这是x86_64可以看出我的系统是64的, 这里根据自己的系统进行键入。
–enable-shared 表示生成动态库,gdb是动态调用python,一开始没有加则报错未能找到或者python不可用
–enable-unicode=ucs2 标识使用ucs2编码编译,因为gdb调用python时候是用ucs2。

好了, 安装完后我们检测下, 终端键入python --version, 回车, 再键入which python查看版本
如果当前版本路径不对,则再按照上面步骤设置道我们编译安装的python版本目录上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt远程调试ARM板 的相关文章

  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • 线程安全的向量和字符串容器?

    我之前发过一个问题 在嵌入式 Linux 平台上使用 std string 时出现段错误 https stackoverflow com questions 2412667 seg fault when using stdstring on
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t

随机推荐