在GDB下调试STM32的记录

基于VSCode使用GDB来调试STM32,我感觉比那个Keil还好用,而且更懂底层原理; 一、调试步骤: 准备工作 已经熟悉arm gcc工具链; 已经在win中安装好mingw或者arm-none-eabi-gcc工具; 具有合适的代码工程和编译脚本,且编译输出elf文档时,已添加-g选项来生成调试信息; 安装jlink调试工具和对应驱动; 有对应的硬件电路; 1、启动Jlink GDB Server 打开Jlink诸多工具中的Jlink GDB Server并配置好: 启动: 可以看到本地端口为2331,这个一会会用到; 然后就可以把这个窗口最小化了; 2、GDB调试 启动GDB程序: arm-none-eabi-gdb.exe 然后按enter自动进入调试模式; 输入file H743_demo.elf加载调试文档: 然后输入target remote localhost:2331,连接gdb server,连接成功后,会在Jlink GDB server中显示对应的状态,如下所示: 输入monitor reset来复位MCU,从而让MCU处于确定的状态: 输入load往MCU中加载调试文档(是加载进flash,而不是ram),也就是常见的烧录过程: 输入break main设置main断点,让MCU执行到main中停止: 输入c持续运行直至运行到断点处: HAL_Init();是main函数的第一行代码,停在这里; 再次输入c会继续运行; 若要打断持续运行的状态,只需要按下Ctrl+c即可; 3、需要注意的地方 每次程序重新编译都要执行一次load以加载新的elf文档; 如果不使用命令行,而是使用VSCODE中的调试功能,则也需要在程序更新的时候重新load一次; 二、常用命令 1、p(打印) p+变量名:打印变量值: 2、s(单步运行) s:单步运行; 并且可以用 breakpoint+行号进行断点设置; 3、l(列出) 列出当前位置前后共5行程序; 4、watch(变量监视) Watchpoints 是用来告诉 GDB 停止执行某个程序的标记。Watchpoints 与数据相关联:放置监视点需要指定一个表达式来描述变量、多个变量或内存地址。 ...

February 27, 2023 · 1 min · Rancho