如何在CLion中借助Qemu调试ARM架构应用程序
前置环境校验
- 确认已安装匹配ARM架构的交叉编译工具链,编译目标程序时添加
-g -O0参数,保留完整调试符号、关闭编译器优化 - 确认Qemu(根据程序类型选择用户态或系统态版本)可正常启动目标ARM程序,确认对应架构的gdb(例如
arm-none-eabi-gdb)可通过命令行正常连接Qemu的调试端口
CLion 配置步骤
步骤1:添加Qemu启动外部工具
打开CLion设置路径:文件 -> 设置 -> 工具 -> 外部工具,点击加号新增工具:
- 名称:自定义填写,例如
Qemu ARM 调试启动 - 程序:填写Qemu可执行文件的绝对路径,例如
/usr/bin/qemu-arm - 实参:根据你的调试场景填写:
- 若为用户态ARM程序调试,填写
-g 1234 $CMakeCurrentProductPath$,其中1234为自定义调试端口,变量会自动替换为当前构建生成的二进制文件路径 - 若为系统态固件/内核调试,填写对应镜像加载参数,并追加
-S -s(-s等价于开启gdb服务端口1234,-S表示启动后暂停等待gdb连接)
- 若为用户态ARM程序调试,填写
- 工作目录:填写
$ProjectFileDir$
保存后可手动运行一次该外部工具,确认Qemu正常启动并停在等待gdb连接的状态。
步骤2:配置GDB远程调试项
点击CLion右上角运行配置下拉框,选择编辑配置,点击加号新增GDB 远程调试配置:
- 名称:自定义填写,例如
Qemu ARM 调试 - 目标、可执行文件:选择对应的ARM交叉构建目标和生成的二进制文件
- GDB:选择对应ARM架构的gdb可执行文件绝对路径,例如
/usr/bin/arm-none-eabi-gdb,禁止使用系统默认的x86架构gdb - 目标远程参数:填写
tcp:localhost:1234,端口需和上一步Qemu配置的调试端口保持一致 - 取消勾选
下载可执行文件到目标选项
步骤3:常规调试流程
- 点击
工具 -> 外部工具 -> 你创建的Qemu启动工具,启动Qemu调试服务 - 选中上一步创建的GDB远程调试配置,点击调试按钮即可完成连接,正常使用CLion的断点、变量查看、单步执行等全量IDE调试功能
可选优化:免手动启动Qemu
如果不需要手动控制Qemu启动时机,可以在GDB远程调试配置的启动前步骤中,点击加号添加运行外部工具,选择你创建的Qemu启动工具,之后每次点击调试按钮会自动启动Qemu再连接调试。
常见问题排查
- 连接失败时优先检查调试端口是否被占用、防火墙是否屏蔽对应端口、Qemu启动是否有报错
- 确认交叉编译目标架构、Qemu运行架构、gdb架构三者完全匹配,架构不匹配会直接导致连接失败
- 系统态调试时需要保证gdb加载的符号文件和Qemu加载的镜像版本完全一致,符号偏移地址和镜像加载地址匹配
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

