1.前言
當(dāng)我們遇到問題的時候,可以加打印信息追蹤流程,但更有效的方式是:調(diào)試。如果你使用的是keil,可以借助stlink或者jlink進(jìn)行調(diào)試。如果你是使用的gnu工具鏈,硬件支持jlink,那么我們可以借助gdb+jlink的方式進(jìn)行調(diào)試;如果我們硬件支持的是stlink,則可以借助gdb+openocd+stlink進(jìn)行調(diào)試。
2.使用GDB調(diào)試OneOS
GDB,全稱GNU Project debugger,是UNIX及UNIX-like下的強(qiáng)大調(diào)試工具,同時也支持對嵌入式系統(tǒng)進(jìn)行調(diào)試。對嵌入式系統(tǒng)進(jìn)行調(diào)試時,是以遠(yuǎn)程調(diào)試的方式進(jìn)行的,調(diào)試環(huán)境的軟硬件連接如下:

在上圖的結(jié)構(gòu)中,支持嵌入式芯片調(diào)試的GDB Server有多款,這里主要介紹OpenOCD和J-Link GDB Server。
J-Link GDB Server由SEGGER公司推出,僅支持使用Jlink作為調(diào)試適配器進(jìn)行調(diào)試
OpenOCD,全稱Open On-Chip Debugger,是一款針對嵌入式芯片調(diào)試的開源軟件,支持市面上大多數(shù)的調(diào)試適配器,例如stlink、DAPlink、Jlink等。OpenOCD支持GDB查看RTOS線程,OneOS已對其進(jìn)行了適配。使用OpenOCD作為GDB Server,可以查看OneOS所有線程的調(diào)用棧和棧上的臨時變量,對于調(diào)試,能提供更多的信息
3.gdb結(jié)合stlink調(diào)試
這里以萬耦開發(fā)板stm32f401-vet-oneos為例演示調(diào)試過程,由于OpenOCD配合Jlink使用時,需要將Jlink的驅(qū)動切換成通用usb驅(qū)動(OpenOCD不支持Jlink的原生驅(qū)動,如果需要,可以使用zadig這款開源軟件將Jlink驅(qū)動切換成WinUSB或libusb),為了方便起見,在使用OpenOCD調(diào)試時,調(diào)試適配器選擇stlink。
3.1 獲取OpenOCD
下載預(yù)編譯的Windows版本請點擊OpenOCD下載。
3.2 目錄結(jié)構(gòu)
OpenOCD編譯后的二進(jìn)制文件目錄結(jié)構(gòu)如下:

3.2 添加環(huán)境變量
OPENOCD_BIN_PATH="D:\Program\openocd\bin"
OPENOCD_SCRIPT_PATH="D:\Program\openocd\share\openocd\scripts"
3.3 配置文件oneos.cfg
在stm32f401-vet-oneos工程目錄下創(chuàng)建配置文件oneos.cfg,文件內(nèi)容如下:
# this need match your debug adaptor and target device
source [find interface/stlink-v2.cfg]
source [find target/stm32f4x.cfg]
# config openocd support OneOS
$_TARGETNAME configure -rtos oneos
# halt target after gdb attached
$_TARGETNAME configure -event gdb-attach { halt }
3.4 啟動openOCD
在OneOS-Lite代碼根目錄運行OneOS-Cube,執(zhí)行如下命令:
%OPENOCD_BIN_PATH%\openocd.exe -c "gdb_port 5000" -s %OPENOCD_SCRIPT_PATH% -f .\projects\stm32f401-vet-oneos\oneos.cfg
運行成功后的界面如下,此時OpenOCD已配置完成:

4 啟動gdb調(diào)試
在OneOS-Lite代碼根目錄下運行OneOS-Cube,執(zhí)行如下命令運行GDB
arm-none-eabi-gdb.exe .\out\stm32f401-vet-oneos\oneos.elf
在GDB命令行交互界面中執(zhí)行如下命令連接GDB Server,其中:5000是GDB Server的tcp端口號,對應(yīng)上面OpenOCD運行時指定的gdb_port(如果使用J-Link GDB Server,則端口選擇上面顯示的2331)
target remote localhost:5000
連接成功后,GDB命令行交互界面如下

5.開始調(diào)試OneOS-Lite
- 查看當(dāng)前線程調(diào)用棧和臨時變量

- 查看所有正在運行的線程(J-Link GDB Server不支持此命令)

- 切換到其他線程并查看調(diào)用棧與臨時變量(J-Link GDB Server不支持此命令)

- 打斷點
b entry
- 重新加載
load
更多的GDB用法,請查看官方文檔。
6.關(guān)注&&聯(lián)系
gitee: https://gitee.com/cmcc-oneos/OneOS-Lite
docs: https://oneos-lite.com/
摘自:https://os.iot.10086.cn/oneos-doc-2.0/components/debug/OpenOCD/