Core Dump:調(diào)試 ESP32 開發(fā)板上 Zephyr 程序錯(cuò)誤的強(qiáng)大工具

Zephyr?是一個(gè)開源、可擴(kuò)展、適應(yīng)性強(qiáng)的實(shí)時(shí)操作系統(tǒng) (RTOS),能夠在多種硬件平臺(tái)上運(yùn)行,包括?樂鑫?的 ESP32、ESP32-S2、ESP32-C3 和 ESP32-S3 系列產(chǎn)品。Zephyr 為嵌入式系統(tǒng)開發(fā)提供了豐富的功能,包括針對(duì)無法恢復(fù)的軟件錯(cuò)誤生成可供分析的 core dump。?
Core dump 是在程序崩潰時(shí)保留的內(nèi)存快照,可用于調(diào)試程序,查找崩潰原因、以及確定導(dǎo)致崩潰的具體任務(wù)、代碼行和調(diào)用堆棧。如果需要,還可以為變量賦值并存儲(chǔ)變量內(nèi)容。?
Zephyr 操作系統(tǒng)支持多個(gè) core dump 后端,其中包括日志后端。日志后端將 core dump 輸出到 UART,然后保存到文件中,這樣就可以使用自定義的 GDB 服務(wù)器和 SDK 提供的 GDB 進(jìn)行分析。?
如何使用
要使用 core dump 的日志后端,需要啟用相應(yīng)的 Kconfig 選項(xiàng):?
一旦啟用了日志后端,應(yīng)用程序在遇到致命錯(cuò)誤時(shí)將生成 core dump。CPU 寄存器和內(nèi)存內(nèi)容將被打印到控制臺(tái)。?
將內(nèi)容復(fù)制并粘貼到一個(gè)名為?coredump.log?的文件中。?
我們需要將這個(gè)文本文件轉(zhuǎn)換為自定義 GDB 服務(wù)器可以解析的二進(jìn)制文件。只需運(yùn)行 coredump_serial_log_parser.py 腳本即可。?
該腳本會(huì)把二進(jìn)制文件輸出到 coredump.bin。
使用 zephyr 應(yīng)用程序中的 .elf 文件,并將 coredump.bin 作為參數(shù),啟動(dòng)自定義的 GDB 服務(wù)器:
打開另一個(gè)終端,從 Zephyr SDK 里運(yùn)行 Xtensa 的 GDB,將 .elf 文件作為參數(shù):?
在 GDB 內(nèi)部,使用以下命令連接到自定義服務(wù)器:?
現(xiàn)在,您可以檢查程序崩潰時(shí)的狀態(tài),讀取變量值、回溯信息和寄存器值了。?
示例?
下面是一個(gè)使用 core dump 進(jìn)行調(diào)試的例子。?
我們?cè)?tests/subsys/debug/coredump 里創(chuàng)建并燒錄 core dump 示例。?
該示例定義了三個(gè)函數(shù):func_1,func_2 和 func_3。func_1 調(diào)用 func_2,func_2 調(diào)用func_3。func_3 試圖對(duì)空指針進(jìn)行解引用,這將導(dǎo)致程序崩潰。?
程序崩潰會(huì)生成一個(gè) core dump 文件,我們將用它來調(diào)試程序。?
1.創(chuàng)建應(yīng)用程序:
?2.燒錄并監(jiān)控 ESP32 開發(fā)板:
預(yù)期輸出:?
Coredump內(nèi)容以#CD:BEGIN#開始,以#CD:END#結(jié)束。我們需要將這兩者之間的內(nèi)容復(fù)制到一個(gè)名為 coredump.log 的新文件中。
3.將 core dump 復(fù)制到 coredump.log:
4.轉(zhuǎn)換為二進(jìn)制格式:
5.啟動(dòng)自定義的 GDB 服務(wù)器:
預(yù)期輸出:
6.打開一個(gè)新的終端,啟動(dòng) Zephyr SDK 中的 Xtensa ESP32 GDB:
7.在 GDB 內(nèi)部,連接到遠(yuǎn)程服務(wù)器:
8.運(yùn)行 bt 命令查看回溯信息:
結(jié)論
Core dump 是一個(gè)強(qiáng)大的工具,用于調(diào)試 ESP32 開發(fā)板上的 Zephyr 程序錯(cuò)誤。通過使用 core dump 的日志后端,您可以輕松生成 core dump 文件,并使用調(diào)試器進(jìn)行分析。這將幫助您快速、方便地找出程序崩潰的原因,并修復(fù) bug。
相關(guān)鏈接
Zephyr
https://www.zephyrproject.org
樂鑫
https://www.espressif.com/zh-hans/home