在没有源代码,没有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工具
- 可写入Black Magic Probe固件,使其可直接使用arm-none-eabi-gdb进行在线调试
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'
而在另一个终端中执行arm-none-eabi-gdb命令,进入gdb命令的交互模式,输入target remote :3333与OpenOCD进行通信,实现在线调试的目的:
而这时,在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的配置界面设置如下:
NOTE:这里选择的target device为STM32F103RB,实际上是要选择STM32F103CB的。
进入主界面之后取消loghost only, 以便我们可以通过其他电脑连接gdb server:
NOTE:
这里我们可以看到J-Link GDB Server开放的TCP端口号为2331,同时我们还需要知道这台电脑的IP地址(IP: 192.168.1.14,Window系统真不好用,控制台也不好用)
在gdb的交互界面执行target remote 192.168.1.14:2331连接gdb server:
之 后J-Link GDB Server界面会显示如下信息:
- 使用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:设置窗口显示高度不受限制
- 相关的参考文档
- http://openocd.org/doc/html/GDB-and-OpenOCD.html
- ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_29.html
- ftp://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html