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板 的相关文章

  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • ARM Cortex-M3 启动代码

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

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e
  • 在 Intel 机器 (Mac) 上构建 ARM 架构的 Docker 镜像

    我希望能够从我的 Mac 构建 ARM 的 Docker 映像 我知道我可以使用 QEMU 在 Mac 上运行 ARM 容器 但我不知道如何为 ARM 构建 现在这有点复杂 我相信在不久的将来 docker 会让这一切变得更容易 基本上 您
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir

随机推荐