pyocd + arm-none-eabi-gdb 调试 ARM 程序

环境搭建

安装 pyocd

1
pip3 install --user pyocd

安装 arm-none-eabi-gdb

本来 gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/ 工具链中自带有 arm-none-eabi-gdb 但是这个版本的 arm-none-eabi-gdb
依赖于 libpython3.6m.so.1.0 这个动态库, 而本机的python 已经升级到 3.11 了, 所以用不了, 只能下载最新的 arm-none-eabi-gdb

1
sudo pacman -S arm-none-eabi-gd

安装的版本是 arm-none-eabi-gdb-13.2-1-x86_64

pyocd + arm-none-eabi-gdb简单使用

使用建立一个 gdb server

这个server 负责接收 arm-none-eabi-gdb 的命令然后转发到开发板上

1
pyocd gdbserver --target=mm32spin0230b1nv --pack=/path-to/MindMotion.MM32SPIN0230_DFP.0.9.1.pack

如果嫌命令太长, 可以在运行目录下新建一个 pyocd.yaml 文件
内容如下:

1
2
pack:
    - /path-to/MindMotion.MM32SPIN0230_DFP.0.9.1.pack

要使用绝对路径, 这样就可以省略掉 –pack 选项, 或者本身已经通过 pyocd pack install 了对应的pack 包的话, 也可以省略掉 –pack 选项

使用 arm-none-eabi-gdb 调试arm程序

使用pacman 安装的 arm-none-eabi-gdb

启动arm-none-eabi-gdb

1
/usr/bin/arm-none-eabi-gdb build/BLDC_CMP_LESS.elf

设置芯片架构

1
set architecture armv6-m

连接gdb server

1
target remote :3333

下载程序到开发板

这里由于arm-none-eabi-gdb 的时候已经传入了 elf 文件, 这里的load 可以省略后面的FILE

1
load

查看pc 值

1
p $pc

可以看到 load 之后芯片自动复位了

b 设置断点

1
b main

c 运行程序

1
c

Ctrl + c 中断运行

Ctrl + c

list 列出当前 pc 所在行的上下共10 行代码

1
list

where 查看当前代码所在的位置

1
where

更多命令使用 help 查看

1
help all

使用 arm-none-eabi-gdb 脚本, 简化操作

新建一个 mygdb.init

1
2
3
4
5
6
target remote :3333
monitor sleep 1
set architecture armv6-m
load
b main
c

启动 arm-none-eabi-gdb

1
/usr/bin/arm-none-eabi-gdb build/BLDC_CMP_LESS.elf -x ./mygdb.init
Licensed under CC BY-NC-SA 4.0