Qt Creator 配置 gdb-multiarch 远程调试海思开发板应用

概述

本文档详细说明如何在 Linux 台式机(Ubuntu 22.04)上使用 Qt Creator 配置 gdb-multiarch,实现远程调试运行在海思 3519AV100 开发板上的 Qt 应用程序。


01 环境准备

1.1 安装 gdb-multiarch

gdb-multiarch 是支持多种架构的通用 gdb 调试器,比专用交叉 gdb 更灵活。

bash 复制代码
# 在 Linux 台式机上安装
sudo apt update
sudo apt install gdb-multiarch

# 验证安装
which gdb-multiarch
gdb-multiarch --version

输出示例:

复制代码
GNU gdb (Ubuntu 12.1-3ubuntu1) 12.1
This GDB was configured as "x86_64-linux-gnu".
This GDB supports the following targets: aarch64-linux-gnu, arm-linux-gnueabi, ...

1.2 确认开发板上的 gdbserver

海思开发板需要运行 gdbserver 来接受远程调试连接。

bash 复制代码
# SSH 登录到开发板
ssh root@192.168.1.100

# 检查是否有 gdbserver
which gdbserver
gdbserver --version

# 如果没有,需要部署(见 1.3 节)

1.3 部署 gdbserver 到开发板

如果开发板上没有 gdbserver

bash 复制代码
# 在开发主机上查找 gdbserver
find /opt/arm-himix200-linux -name gdbserver

# 如果工具链中有,直接复制
scp /opt/arm-himix200-linux/bin/gdbserver root@192.168.1.100:/usr/bin/

# 如果工具链中没有,从源码编译(见附录 A)

02 编译带调试符号的应用

2.1 修改 .pro 文件

确保项目包含调试符号:

pro 复制代码
# 在 .pro 文件中添加
CONFIG += debug
# 或
CONFIG += debug_and_release

2.2 使用 Qt Creator 编译调试版本

  1. 打开 Qt Creator

  2. 打开项目(portableendoscopesproject.pro

  3. 在左侧工具栏点击 "项目" 图标

  4. 选择 "构建" 选项卡

  5. "构建步骤" 中,添加额外参数:

    复制代码
    CONFIG+=debug
  6. 点击 "重新构建项目"

2.3 验证调试符号

bash 复制代码
# 在构建目录下检查
cd build-debug
file your_app
# 输出应包含 "with debug_info"

# 或使用 readelf 检查
arm-himix200-linux-readelf -S your_app | grep debug

03 配置 Qt Creator 远程调试

3.1 配置设备(Development Board)

参考截图:

步骤 截图
添加设备入口
选择设备类型
填写设备信息
SSH 配置
完成配置
  1. 打开 Qt Creator
  2. 菜单栏:工具选项 (或 ToolsOptions
  3. 左侧选择 设备Devices
  4. 点击 添加Add)按钮
  5. 选择 通用 Linux 设备Generic Linux Device
  6. 填写设备信息:
    • 名称:Hisilicon-3519AV100
    • IP 地址:192.168.1.100(开发板 IP)
    • SSH 端口:22
    • 用户名:root
    • 认证类型:密码 或 密钥
  7. 点击 测试Test)按钮验证连接
  8. 成功后点击 确定

重要: 如果需要使用 SSH 端口转发(当开发板防火墙阻止 GDB 端口时):

  • 在设备配置页面,勾选 Use SSH port forwarding for debugging
  • 这样 Qt Creator 会通过 SSH 隧道转发调试端口,无需在开发板防火墙中开放额外端口

3.2 配置调试器(gdb-multiarch)

参考截图: Qt Creator 调试器配置界面(参见 Qt 官方文档)

  1. 选项 窗口中,左侧选择 调试器Debugger

  2. 切换到 GDB 选项卡

  3. 点击 添加Add)按钮

  4. 填写调试器信息:

    • 名称:gdb-multiarch
    • 路径/usr/bin/gdb-multiarch
    • ABI:arm-linux-generic-elf-32bit
  5. 配置 GDB 额外选项(可选):

    • Extra Startup Commands 中添加:

      复制代码
      set solib-search-path /usr/local/qt5.8.0/lib
      set substitute-path /original/build/path /current/source/path
  6. 点击 确定

截图说明:

Qt Creator 调试器配置界面的截图,显示 GDB 选项卡和添加调试器的对话框。

3.3 配置构建套件(Kit)

  1. 选项 窗口中,左侧选择 构建套件Kits
  2. 点击 添加Add)按钮
  3. 填写套件信息:
    • 名称:Hisilicon-3519AV100-Debug
    • 设备:选择刚创建的 "Hisilicon-3519AV100"
    • 调试器:选择刚创建的 "gdb-multiarch"
    • 编译器:arm-himix200-linux-g++(C++)、arm-himix200-linux-gcc(C)
    • Qt 版本:选择海思 ARM 版本的 Qt(如果已配置)
  4. 点击 确定

04 部署应用到开发板

4.1 配置部署步骤

  1. 在 Qt Creator 中打开项目
  2. 左侧工具栏点击 "项目"
  3. 选择 "运行" 选项卡
  4. "部署" 部分,点击 添加部署步骤
  5. 选择 "上传文件"Upload Files
  6. 配置上传规则:
    • 本地文件路径build-debug/your_app
    • 远程目录/opt/app/
  7. 可以添加多个部署步骤,例如:
    • 上传可执行文件
    • 上传依赖库
    • 设置权限(chmod +x /opt/app/your_app

4.2 配置运行环境

  1. "运行" 选项卡中,找到 "运行环境"

  2. 添加环境变量:

    复制代码
    QTDIR=/usr/local/qt5.8.0
    LD_LIBRARY_PATH=/usr/local/qt5.8.0/lib:$LD_LIBRARY_PATH
    QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
  3. 设置 "运行配置"

    • 运行可执行文件/opt/app/your_app
    • 命令行参数:(根据需要填写)

05 启动远程调试

5.1 在开发板上手动启动 gdbserver

方式1:启动新程序

bash 复制代码
# SSH 登录到开发板
ssh root@192.168.1.100

# 设置环境变量
export QTDIR=/usr/local/qt5.8.0
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0

# 启动 gdbserver
gdbserver :1234 /opt/app/your_app

输出示例:

复制代码
Process /opt/app/your_app created; pid = 1234
Listening on port 1234

方式2:附加到已运行进程

bash 复制代码
# 查找进程 PID
ps | grep your_app

# 附加到进程
gdbserver :1234 --attach <PID>

5.2 在 Qt Creator 中连接远程调试

  1. 在 Qt Creator 中,点击左下角的 调试Debug)按钮
  2. 选择 "开始调试""连接到远程调试服务器"
  3. 填写连接信息:
    • 调试器:gdb-multiarch
    • 服务器地址192.168.1.100:1234
    • 本地可执行文件/path/to/build-debug/your_app
    • 工作目录/opt/app/
  4. 点击 确定

Qt Creator 会自动:

  • 连接到开发板上的 gdbserver
  • 加载调试符号
  • main() 函数入口设置断点(可配置)
  • 显示调试控制台和变量窗口

5.3 使用 Qt Creator 调试界面

主要调试窗口:

窗口 功能
调试控制台 显示 gdb 输出和命令
局部变量 显示当前栈帧的局部变量
表达式 添加自定义监视表达式
断点 管理所有断点
线程 查看和管理线程
调用栈 显示函数调用栈
寄存器 查看 CPU 寄存器(高级)
内存 查看原始内存(高级)

常用调试操作:

操作 快捷键 说明
继续 F5 继续执行到下一个断点
中断 Shift+F5 暂停程序执行
单步进入 F11 单步执行,进入函数
单步跳过 F10 单步执行,不进入函数
单步跳出 Shift+F11 执行到当前函数返回
运行到光标 Ctrl+F10 执行到光标位置
切换断点 F9 在当前行设置/取消断点

06 高级配置

6.1 设置源代码路径映射

如果可执行文件在编译时的源代码路径与当前路径不同,需要设置路径映射:

  1. 在 Qt Creator 中,菜单栏:调试调试器控制台

  2. 在调试器命令行中输入:

    复制代码
    set substitute-path /original/build/path /current/source/path
  3. 例如:

    复制代码
    set substitute-path /home/user/project /home/newuser/project

永久配置: 在项目 .pro 文件中添加:

pro 复制代码
# 在 .pro 文件中添加
QMAKE_CXXFLAGS += -fdebug-prefix-map=/original/path=/mapped/path

6.2 设置库搜索路径

如果调试时无法加载符号,需要设置库搜索路径:

  1. 在 Qt Creator 中,菜单栏:调试调试器控制台

  2. 输入:

    复制代码
    set solib-search-path /usr/local/qt5.8.0/lib:/opt/arm-libs

或在 Qt Creator 项目中配置:

  1. 打开项目

  2. 项目运行运行环境

  3. 添加:

    复制代码
    SOLIB_SEARCH_PATH=/usr/local/qt5.8.0/lib:/opt/arm-libs

6.3 使用 Qt Creator 的 .gdbinit 自动化

创建 ~/.gdbinit 文件:

复制代码
# 设置库搜索路径
set solib-search-path /usr/local/qt5.8.0/lib

# 设置源代码路径映射
set substitute-path /original/path /current/path

# 加载 Qt 的 gdb 宏(如果可用)
source /path/to/qt/tools/qt.gdb

# 设置断点
break main

Qt Creator 启动 gdb 时会自动加载此文件。


07 调试技巧

7.1 查看 Qt 对象

在调试器控制台中:

gdb 复制代码
# 查看 QString
print qstring_var.toLatin1().constData()

# 查看 QList/QVector
print vector[0]

# 查看 QMap/QHash
print map["key"]

如果上述命令不工作,使用 Qt 的 gdb 宏:

  1. 下载 Qt 的 gdb 宏:qt.gdb

  2. 在调试器控制台中加载:

    复制代码
    source /path/to/qt.gdb
  3. 使用宏命令:

    复制代码
    printqstring qstring_var
    printqlist vector

7.2 条件断点

在 Qt Creator 中设置条件断点:

  1. 在代码行号左侧点击,设置普通断点

  2. 右键点击断点,选择 "编辑断点"

  3. "条件" 字段中输入条件:

    复制代码
    counter == 10
  4. 点击 确定

只有当条件为真时,程序才会在该断点处暂停。

7.3 观察点(Watchpoint)

监视变量或内存地址的变化:

gdb 复制代码
# 在调试器控制台中输入
watch variable_name
watch *0x76f8c000

当变量或内存内容改变时,程序会自动暂停。

7.4 记录调试日志

gdb 复制代码
# 在调试器控制台中输入
set logging file gdb_session.log
set logging on

# 执行调试命令...

# 关闭日志记录
set logging off

08 常见问题与解决方案

8.1 问题1:Qt Creator 无法连接到 gdbserver

现象:

复制代码
Unable to connect to remote target.

原因:

  • 开发板 IP 地址错误
  • 端口被防火墙阻止
  • gdbserver 未正确启动

解决:

bash 复制代码
# 在开发主机上测试连接
ping 192.168.1.100
telnet 192.168.1.100 1234

# 在开发板上检查 gdbserver 是否运行
ps | grep gdbserver
netstat -tulnp | grep 1234

8.2 问题2:找不到调试符号

现象:

复制代码
No symbol table info available.

原因:

  • 编译时未包含 -g 选项
  • 可执行文件被 strip 过

解决:

bash 复制代码
# 检查是否包含调试符号
file your_app
readelf -S your_app | grep debug

# 重新编译带调试符号的版本
qmake CONFIG+=debug
make clean
make -j8

# 确保未 strip
arm-himix200-linux-objdump -h your_app | grep debug

8.3 问题3:Qt Creator 显示 "Cannot load library"

现象:

复制代码
Cannot load library: File not found

原因:

  • QT_PLUGIN_PATH 未正确设置
  • 插件未部署到开发板

解决:

bash 复制代码
# 在开发板上设置环境变量
export QTDIR=/usr/local/qt5.8.0
export QT_PLUGIN_PATH=$QTDIR/plugins
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

# 在 Qt Creator 的"运行环境"中添加上述变量

8.4 问题4:字体显示问题

现象:

复制代码
QFontDatabase: Cannot find font directory

解决:

bash 复制代码
# 部署字体文件到开发板
scp -r /usr/share/fonts root@192.168.1.100:/usr/share/
scp -r ./字库/* root@192.168.1.100:/usr/local/qt5.8.0/lib/fonts/

# 设置字体路径
export QT_QWS_FONTDIR=/usr/local/qt5.8.0/lib/fonts

8.5 问题5:gdb-multiarch 无法识别 ARM 架构

现象:

复制代码
Undefined target command: arm-linux.

解决:

bash 复制代码
# 检查 gdb-multiarch 支持的架构
gdb-multiarch
(gdb) set architecture
# 会显示支持的架构列表

# 手动设置架构
(gdb) set architecture arm
(gdb) set endian little

09 完整调试工作流程

步骤1:准备调试版本

bash 复制代码
# 在 Qt Creator 中
1. 打开项目
2. 切换到 debug 构建配置
3. 点击"构建"按钮(或 Ctrl+B)

步骤2:部署到开发板

bash 复制代码
# 方式1:使用 Qt Creator 部署
1. 配置"部署"步骤(见 04 节)
2. 点击"运行"按钮(或 Ctrl+R)

# 方式2:手动部署
scp your_app root@192.168.1.100:/opt/app/
scp /usr/local/qt5.8.0/lib/libQt5Core.so.5 root@192.168.1.100:/usr/local/qt5.8.0/lib/

步骤3:在开发板上启动 gdbserver

bash 复制代码
# SSH 登录到开发板
ssh root@192.168.1.100

# 设置环境变量
export QTDIR=/usr/local/qt5.8.0
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0

# 启动 gdbserver
gdbserver :1234 /opt/app/your_app

步骤4:在 Qt Creator 中启动远程调试

bash 复制代码
# 在 Qt Creator 中
1. 点击左下角的"调试"按钮
2. 选择"开始调试" → "连接到远程调试服务器"
3. 填写连接信息:
   - 服务器地址:192.168.1.100:1234
   - 本地可执行文件:/path/to/your_app
4. 点击"确定"

步骤5:调试

bash 复制代码
# Qt Creator 会自动:
1. 连接到 gdbserver
2. 在 main() 设置断点
3. 显示调试界面

# 使用调试工具栏:
- 继续/暂停
- 单步进入/跳过/跳出
- 查看变量、调用栈、断点

步骤6:调试完成后清理

bash 复制代码
# 在 Qt Creator 中
1. 点击"停止调试"按钮(或 Shift+F5)

# 在开发板上
1. Ctrl+C 停止 gdbserver
2. 或:killall gdbserver

10 参考资料


附录 A:从源码编译 gdbserver

如果工具链中没有 gdbserver,需要从源码编译:

bash 复制代码
# 下载 gdb 源码
wget https://ftp.gnu.org/gnu/gdb/gdb-8.3.tar.gz
tar -xzf gdb-8.3.tar.gz
cd gdb-8.3

# 配置为交叉编译 gdbserver
./configure --target=arm-linux --host=arm-linux \
    --prefix=/usr/local/arm-gdbserver \
    CC=arm-himix200-linux-gcc \
    CXX=arm-himix200-linux-g++

make -j4
make install

# 复制 gdbserver 到开发板
scp gdbserver root@192.168.1.100:/usr/bin/

附录 B:快速命令参考

bash 复制代码
# 开发板端
gdbserver :1234 /opt/app/your_app          # 启动调试服务器
gdbserver :1234 --attach <PID>            # 附加到进程

# 开发主机端(命令行)
gdb-multiarch ./your_app                  # 启动 gdb-multiarch
(gdb) target remote 192.168.1.100:1234   # 连接开发板
(gdb) break main                           # 设置断点
(gdb) continue                             # 继续执行
(gdb) print variable                       # 查看变量
(gdb) backtrace                            # 查看调用栈
(gdb) quit                                 # 退出 gdb

# Qt Creator 中
F5       # 继续
F9       # 切换断点
F10      # 单步跳过
F11      # 单步进入
Shift+F11 # 单步跳出
Ctrl+F10 # 运行到光标

适用平台: 海思 3519AV100 + Ubuntu 22.04 + Qt Creator + gdb-multiarch