STM32: 使用arm-none-eabi-gdb在线调试固件

在没有源代码,没有symbol文件下,使用arm-none-eabi-gdb进行在线调试,分析固件的程序架构与流程是一件非常痛苦的事情。即使是一个只有15KiB的文件,也需要奋斗好几天。

一个好用,顺手的工具在调试过程中是多么的重要!

  • 使用OpenOCD + ST-LINK/V2-1 + arm-none-eabi-gdb进行在线调试

这里,ST-LINK/V2-1使用的固件为ST原厂固件。

喜欢使用ST-LINK/V2-1工具主要是因为:

- 通过OpenOCD写入固件非常方便,只需执行一条命令就可以进行固件的写入与完整性验证,OpenOCD对ST-LINK/V2-1支持非常好

- ST-LINK/V2-1自带串口,可以很方便地取得串口log,而不需要额外的工具

- ST-LINK/V2-1可支持JLink固件,可以通过STLinkReflash工具将ST-LINK/V2-1升级成JLink工具

STM32: 从STLinkReflash提取jlink与ST-LINK/V2-1固件

- 可写入Black Magic Probe固件,使其可直接使用arm-none-eabi-gdb进行在线调试

STM32: Black Magic Probe @ BRO-DBG-LINK-V2-1

NOTE:

之前尝试过写入最新的Black Magic Probe固件,使用arm-none-eabi-gdb进行在线调试,效果不太好。

在线调试的方法:

在一个终端中执行如下命令:

$ /usr/local/bin/openocd -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c init -c 'reset halt'

2016_11_02_stlink_openocd

而在另一个终端中执行arm-none-eabi-gdb命令,进入gdb命令的交互模式,输入target remote :3333与OpenOCD进行通信,实现在线调试的目的:

2016_11_02_stlink_gdb

而这时,在OpenOCD终端,会显示如下信息:

Open On-Chip Debugger 0.10.0-dev-00288-g060e9c3 (2016-05-14-22:52)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 4000 kHz
adapter_nsrst_delay: 100
none separate
Info : clock speed 4000 kHz
Info : STLINK v2 JTAG v27 API v2 SWIM v15 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 4.134295
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
stm32f1x.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08002e0c msp: 0x20001ce0
Info : accepting 'gdb' connection on tcp/3333
Info : device id = 0x20036410
Info : flash size = 128kbytes

这里我们也可以看到,默认情况下OpenOCD开放3333 TCP端口与gdb进行通信。

  • 使用JLink GDB Server + JLink V8 + arm-none-eabi-gdb进行在线调试

这之前,一直使用ST-LINK/V2-1进行固件下载,这几天开始使用它进行在线调试,就发现的些问题:ST-LINK/V2-1调试性能非常差,跟JLink不能比,特别是在调试与USB通信相关的代码时。而JLink就会好用很多,不会影响到程序执行的性能。

而JLink存在的问题则是OpenOCD对它的支持不太好,通过OpenOCD写入固件或者在线调试时,经常罢工。但是如果使用J-Link GDB Server来进行在线调试,效果又非常好,这里来看一下如何使用J-Link GDB Server进行在线调试。

由于使用的接口协义为SWD, 并且调试的MCU为STM32F103CBT6, 所以在J-Link GDB Server的配置界面设置如下:

2016_11_02_gdb_server

NOTE:这里选择的target device为STM32F103RB,实际上是要选择STM32F103CB的。

进入主界面之后取消loghost only, 以便我们可以通过其他电脑连接gdb server:


2016_11_02_jlink_gdb

NOTE:

这里我们可以看到J-Link GDB Server开放的TCP端口号为2331,同时我们还需要知道这台电脑的IP地址(IP: 192.168.1.14,Window系统真不好用,控制台也不好用)

在gdb的交互界面执行target remote 192.168.1.14:2331连接gdb server:

2016_11_02_jlink_gdb_client

之 后J-Link GDB Server界面会显示如下信息:

2016_11_02_jlink_gdb_connected

  • 使用OpenOCD + Black Magic Probe + arm-none-eabi-gdb进行在线调试

不知道原厂的Black Magic Probe性能怎么样?改天再看看Black Magic Probe的代码,看怎么样才能在ST-LINK/V2-1上正常工作。

 

  • 使用GDB在线调试常用的一些命令

1. Monitor相关的命令,reset/halt被调试的MCU:

- monitor reset

- monitor halt

2. 执行指令

- c/continue:开始、继续执行

-si/stepi:执行单步指令

-ni/nexti:执行下一条指令,与si的区加?

3. 设置断点

-b/break:

-watch:

- rwatch:

-delete :移除断点

相关参考文档:

ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html

ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_29.html

4.  显示

- display /5i $pc:显示当前pc下的5条指令

- undisplay:取消显示

- disas /r $pc,+1:反编译当前pc下的指令,设

5. 连接target

-target remote 192.168.1.14:2331 通过tcp协议连接192.168.1.14:2331的gdb server

6.设置相关

- set logging on/off:设置、取消log文件,默认保存为 gdb.txt

- set height 0:设置窗口显示高度不受限制

  • 相关的参考文档
  1. http://openocd.org/doc/html/GDB-and-OpenOCD.html
  2. ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_29.html
  3. ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注