概述
本文档详细说明如何在 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 编译调试版本
-
打开 Qt Creator
-
打开项目(
portableendoscopesproject.pro) -
在左侧工具栏点击 "项目" 图标
-
选择 "构建" 选项卡
-
在 "构建步骤" 中,添加额外参数:
CONFIG+=debug -
点击 "重新构建项目"
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 配置 | ![]() |
| 完成配置 | ![]() |
- 打开 Qt Creator
- 菜单栏:工具 → 选项 (或 Tools → Options)
- 左侧选择 设备 (Devices)
- 点击 添加 (Add)按钮
- 选择 通用 Linux 设备 (Generic Linux Device)
- 填写设备信息:
- 名称:Hisilicon-3519AV100
- IP 地址:192.168.1.100(开发板 IP)
- SSH 端口:22
- 用户名:root
- 认证类型:密码 或 密钥
- 点击 测试 (Test)按钮验证连接
- 成功后点击 确定
重要: 如果需要使用 SSH 端口转发(当开发板防火墙阻止 GDB 端口时):
- 在设备配置页面,勾选 Use SSH port forwarding for debugging
- 这样 Qt Creator 会通过 SSH 隧道转发调试端口,无需在开发板防火墙中开放额外端口
3.2 配置调试器(gdb-multiarch)
参考截图: Qt Creator 调试器配置界面(参见 Qt 官方文档)
-
在 选项 窗口中,左侧选择 调试器 (Debugger)
-
切换到 GDB 选项卡
-
点击 添加 (Add)按钮
-
填写调试器信息:
- 名称:gdb-multiarch
- 路径 :
/usr/bin/gdb-multiarch - ABI:arm-linux-generic-elf-32bit
-
配置 GDB 额外选项(可选):
-
在 Extra Startup Commands 中添加:
set solib-search-path /usr/local/qt5.8.0/lib set substitute-path /original/build/path /current/source/path
-
-
点击 确定
截图说明:

Qt Creator 调试器配置界面的截图,显示 GDB 选项卡和添加调试器的对话框。
3.3 配置构建套件(Kit)
- 在 选项 窗口中,左侧选择 构建套件 (Kits)
- 点击 添加 (Add)按钮
- 填写套件信息:
- 名称:Hisilicon-3519AV100-Debug
- 设备:选择刚创建的 "Hisilicon-3519AV100"
- 调试器:选择刚创建的 "gdb-multiarch"
- 编译器:arm-himix200-linux-g++(C++)、arm-himix200-linux-gcc(C)
- Qt 版本:选择海思 ARM 版本的 Qt(如果已配置)
- 点击 确定
04 部署应用到开发板
4.1 配置部署步骤
- 在 Qt Creator 中打开项目
- 左侧工具栏点击 "项目"
- 选择 "运行" 选项卡
- 在 "部署" 部分,点击 添加部署步骤
- 选择 "上传文件" (Upload Files)
- 配置上传规则:
- 本地文件路径 :
build-debug/your_app - 远程目录 :
/opt/app/
- 本地文件路径 :
- 可以添加多个部署步骤,例如:
- 上传可执行文件
- 上传依赖库
- 设置权限(
chmod +x /opt/app/your_app)
4.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 -
设置 "运行配置" :
- 运行可执行文件 :
/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 中连接远程调试
- 在 Qt Creator 中,点击左下角的 调试 (Debug)按钮
- 选择 "开始调试" → "连接到远程调试服务器"
- 填写连接信息:
- 调试器:gdb-multiarch
- 服务器地址 :
192.168.1.100:1234 - 本地可执行文件 :
/path/to/build-debug/your_app - 工作目录 :
/opt/app/
- 点击 确定
Qt Creator 会自动:
- 连接到开发板上的 gdbserver
- 加载调试符号
- 在
main()函数入口设置断点(可配置) - 显示调试控制台和变量窗口
5.3 使用 Qt Creator 调试界面
主要调试窗口:
| 窗口 | 功能 |
|---|---|
| 调试控制台 | 显示 gdb 输出和命令 |
| 局部变量 | 显示当前栈帧的局部变量 |
| 表达式 | 添加自定义监视表达式 |
| 断点 | 管理所有断点 |
| 线程 | 查看和管理线程 |
| 调用栈 | 显示函数调用栈 |
| 寄存器 | 查看 CPU 寄存器(高级) |
| 内存 | 查看原始内存(高级) |
常用调试操作:
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 继续 | F5 | 继续执行到下一个断点 |
| 中断 | Shift+F5 | 暂停程序执行 |
| 单步进入 | F11 | 单步执行,进入函数 |
| 单步跳过 | F10 | 单步执行,不进入函数 |
| 单步跳出 | Shift+F11 | 执行到当前函数返回 |
| 运行到光标 | Ctrl+F10 | 执行到光标位置 |
| 切换断点 | F9 | 在当前行设置/取消断点 |
06 高级配置
6.1 设置源代码路径映射
如果可执行文件在编译时的源代码路径与当前路径不同,需要设置路径映射:
-
在 Qt Creator 中,菜单栏:调试 → 调试器控制台
-
在调试器命令行中输入:
set substitute-path /original/build/path /current/source/path -
例如:
set substitute-path /home/user/project /home/newuser/project
永久配置: 在项目 .pro 文件中添加:
pro
# 在 .pro 文件中添加
QMAKE_CXXFLAGS += -fdebug-prefix-map=/original/path=/mapped/path
6.2 设置库搜索路径
如果调试时无法加载符号,需要设置库搜索路径:
-
在 Qt Creator 中,菜单栏:调试 → 调试器控制台
-
输入:
set solib-search-path /usr/local/qt5.8.0/lib:/opt/arm-libs
或在 Qt Creator 项目中配置:
-
打开项目
-
项目 → 运行 → 运行环境
-
添加:
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 宏:
-
下载 Qt 的 gdb 宏:
qt.gdb -
在调试器控制台中加载:
source /path/to/qt.gdb -
使用宏命令:
printqstring qstring_var printqlist vector
7.2 条件断点
在 Qt Creator 中设置条件断点:
-
在代码行号左侧点击,设置普通断点
-
右键点击断点,选择 "编辑断点"
-
在 "条件" 字段中输入条件:
counter == 10 -
点击 确定
只有当条件为真时,程序才会在该断点处暂停。
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 参考资料
- Qt Creator 远程调试文档: https://doc.qt.io/qtcreator/creator-debugger-engines.html
- GDB 官方文档: https://sourceware.org/gdb/current/onlinedocs/gdb/
- gdb-multiarch 使用指南:
man gdb-multiarch - 海思 SDK 文档: 见 SDK 中的
docs/debugging_guide.pdf
附录 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




