Skip to content

工具链 调试

liuzikai edited this page Jul 13, 2021 · 3 revisions

本文将介绍CLion的远程调试(Remote Debug)配置,实现在CLion内调试程序。

前置阅读资料:工具链 概念介绍

GDB、OpenOCD 与 CLion

GDB

大家可能都习惯了各种 IDE 中的调试工具,知道如何设置断点、Step in/out、查看变量等,但不一定有听说过 GDB 。GDB,是指 the GNU Project debugger,是一个开源的 Linux 平台下常用的 debugger,支持多种语言,IDE能实现的运行、暂停、设置断点、查看变量等,GDB统统都能实现,只是 GDB 是一个命令行工具,不如 IDE 直观易用。

CLion 的调试功能是基于 GDB 的,和 CMake 类似,CLion 相当于 GDB 的 wrapper,向下与 GDB 交互,向上与用户交互。

我们需要使用 ARM 工具链中提供的 arm-none-eabi-gdb 工具,这是专为 ARM 系统设计的 GDB 工具,但用法与普通 GDB 相似。

远程调试 Remote Debugging

在本机上编写程序,运行程序、调试程序的设备都是本机。然而,对于一些系统,其通用性或性能达不到本机调试的需求,就比如我们的嵌入式系统,它的性能、IO都非常有限,也不搭载运行 GDB 所需要的环境,这个时候,我们就需要运用远程调试(Remote Debugging)。

在和烧录程序类似,在 PC 上调试 MCU 需要一些中间部件,Adapter 作为 PC 和 MCU 之间的硬件接口,OpenOCD 则负责电脑端与 Adapter 之间的信息交换,同时作为 GDB 的服务端(Server),GDB 与之交互,而 CLion 则作为用户与 GDB 的中间层,如下图所示。

IMAGE

OpenOCD 与 GDB 的信息交互

OpenOCD 首先会通过 Adapter 与 MCU 建立链接,同时作为服务端(Server),它与 GDB 之间可通过不同的方式通信,包括管道 Pipe(A)和 TCP 连接(B)。接下来会分别介绍这两种方式,选用一种即可。



在CLion中部署远程调试

X. CLion 2019.1 及以后版本

在 CLion 2019.1 或以后的版本中,OpenOCD 得到原生支持,直接使用运行按钮旁边的调试按钮即可进入 Remote GDB,不再需要以下复杂的实现方式。以下内容可供有兴趣的同学研究~

当然,如果在 Configuration 内设置了 Download 或者 Reset,开始 Remote GDB 时会自动烧录程序或重置程序(重新开始运行),如果程序卡死,想要确认问题,这是不利的,需要进行相应的配置。

A. Pipe 管道连接

Part 1. 修改 openocd_connect_with_pipe.sh

打开 openocd_connect_with_pipe.sh,将其中第12行 cd 后的内容改为工程的绝对路径。需要这一步操作的原因是目前 CLion 的 Remote DBG 运行 arm-none-eabi-gdb 时的 Working Directory 十分诡异,竟然是在 CLion.app 里面,必须使用绝对路径。

Part 2. 添加 Remote DBG 配置

  1. 右上角Target下拉菜单中选择 Edit Configurations
  2. 添加一个 GDB Remote Debug 配置,命名为 ST-Link DBG Pipe
  3. GDB 选择 arm-none-eabi-gdb
  4. 'target remote‘ args 中填入 | sh (工程目录)/openocd_connect_with_pipe.sh 注意,这里也需要用绝对路径。
  5. Symbol file选择 ‘dev/.build/ch.elf’ PS:.build 目录在 Finder 中是不可见的,可通过 Cmd+Shift+G 手动跳转进去 PPS:需要执行一次编译才有这个文件
  6. 取消勾选 Show this page 否则,每次点击调试按钮后都会弹出这个选项窗口。

IMAGE

B. TCP连接

Part 1. 将 OpenOCD 设置为 External Tool

正如之前所说,OpenOCD 相当于一个服务器,我们需要先单独运行它,使其与 MCU 建立链接,然后再通过 TCP 与 GDB 建立链接。在 CLion 中我们可以将其设置为 External Tool。

  1. CLion - Preference - Tools - External Tools
  2. 添加一个名为 OpenOCD_Server 的工具,将 Program 选择为 config/openocd_connect.sh

IMAGE

Part 2. 添加 Remote DBG 配置

  1. 右上角Target下拉菜单中选择 Edit Configurations
  2. 添加一个 GDB Remote Debug 配置,命名为 ST-Link DBG
  3. GDB 选择 arm-none-eabi-gdb
  4. 'target remote‘ args 中填入 localhost:3333
  5. Symbol file 选择 ‘dev/.build/ch.elf’ PS:.build 目录在 Finder 中是不可见的,可通过 Cmd+Shift+G 手动跳转进去 PPS:需要执行一次编译才有这个文件
  6. 取消勾选 Show this page 否则,每次点击调试按钮后都会弹出这个选项窗口。

IMAGE



使用

  1. 连接上开发版,上传一次程序 请注意,Remote Debug 不含编译、上传程序,如果代码有更改请先手动上传一次程序!

X. CLion 2019.1 及以后版本

  1. 点击调试按钮进入 Remote GDB

A. 管道 Pipe 连接

  1. 左上角的 Target 列表选中 ST-Link GDB Pipe,点击调试 如果连接成功,将会有如下信息,同时 ST-Link 上的指示灯会持续闪烁。

如果连接失败,则是这样的:

IMAGE

OpenOCD 的日志文件写入工程目录下的 openocd.log。

B. TCP连接

  1. 启动 External Tool Tools - External Tools - OpenOCDServer

IMAGE

如果连接成功,将会有如下信息,同时 ST-Link 上的指示灯会持续闪烁。

IMAGE

此时 OpenOCD 保持运行,等待 GDB 的连接。

如果连接失败,则是这样的:

IMAGE

  1. 左上角的 Target 列表选中 ST-Link GDB,点击调试

IMAGE


调试窗口

IMAGE

IMAGE

设置断点

未运行 Remote DBG 之前:

IMAGE

运行 Remote DBG 之后:

IMAGE

断点中间的勾表示断点已被成功设置。程序停在断点处。

停止调试

IMAGE

这将同时停止 OpenOCD 服务端和 Remote DBG。

更新历史

  • 加入Pipe连接方式 2018.8.2 liuzikai
  • 小更新 2019.1.11 liuzikai
  • 增加适用于 CLion 2019.1 或以后版本的使用说明。liuzikai
Clone this wiki locally