使用 ESP32 的調試工具 coredump

懶,暫時不想寫了,直接帖文檔吧,原文路徑: ESP32 的 Core Dump

【ESP32 的 Core Dump】

ESP-IDF 支持在遇到不可恢復的軟件錯誤時產生 core dump。這項有用的技術允許發生錯誤後再分析軟件的狀態。程序一旦崩潰,系統將進入 panic 狀態,打印一些信息並掛起或者重啓系統(依賴於配置)。用戶可以選擇產生 core dump 文件,從而可以在隨後在 PC 上分析失敗的原因。Core dump 中包含失敗的那一刻系統中所有任務的快照。快照包括導致系統崩潰的線程的調用棧(callstack)。 ESP-IDF 提供了一個特殊的腳本 espcoredump.py 用於幫助用戶恢復和分析 core dump。該工具提供了兩個用於分析 core dump 的命令:

info_corefile - 打印崩潰任務的寄存器、調用棧、系統有效任務列、內存區域以及存儲在 core dump 中的內存中的內容(任務控制塊 TCB 和棧)。
dbg_corefile - 創建 core dump ELF 文件,並使用這個文件運行 GDB 調試會話。用戶可以人工檢查內存、變量和任務狀態。需要注意的是,由於不是所有的內容都存放在 cour dump 中,只有分配到棧上的變量值纔有意義。

【配置】

存在許多與 core dump 相關的配置選項,用戶可以在應用程序的配置菜單中進行選擇(make menuconfig)。

Core dump 數據目的地 (Components -> ESP32-specific config -> Core dump destination):

禁止產生 core dump
將 core dump 保存到 flash
將 core dump 打印到 UART

core dump 模塊的日誌級別 (Components -> ESP32-specific config -> Core dump module logging level)。該值是一個從 0(無輸出)到 5(最多輸出)之間的一個數字。
將 core dump 打印到 UART 之前的延遲 (Components -> ESP32-specific config -> Core dump print to UART delay)。該值以 ms 爲單位。

【保存 core dump 到 flash】

當該值被選擇時,core dump 會被保存到 flash 上面的某個特殊分區。當使用 ESP-IDF 提供的默認分區表文件時,它將在 flash 上面自動分配所需空間。但是如果用戶希望使用自己的帶有 core dump 功能的佈局文件,則應當像下面這樣定義獨立的分區表

# Name,   Type, SubType, Offset,  Size
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     0x9000,  0x6000
phy_init, data, phy,     0xf000,  0x1000
factory,  app,  factory, 0x10000, 1M
coredump, data, coredump,,        64K

分區表名沒有特殊的需求,它可以根據用戶應用程序的需要進行選擇,但是分區表類型應當選擇爲 ‘data’,子類型應當選擇爲 ‘coredump’。此外,選擇分區表大小的時候需要注意,core dump 的數據結構會引進一些額外的開銷,包括固定 20 字節加上每個任務 12 字節。這個開銷不包括每個任務的 TCB 大小和棧空間。因此,分區表的大小應當至少爲 20 + 最大任務數量 x (12 + TCB 大小 + 任務最大棧大小) 字節。

從 flash 上面分析 core dump 的常用命令是: espcoredump.py -p info_corefile 或者 espcoredump.py -p dbg_corefile

【打印 core dump 到 UART】

當該選項被選擇時,系統 panic 時會將按照 base64 編碼的 core dump 打印到 UART 上。在這種情況下,用戶需要手工將這些 core dump 文本的 body 保存到某個文件中,然後運行如下的目錄: espcoredump.py info_corefile -t b64 -c 或者 espcoredump.py dbg_corefile -t b64 -c

按照 base64 編碼的 core dump 的 body 位於下面的頭部和尾部之間

================= CORE DUMP START =================

【運行 ‘espcoredump.py’】

命令的常用語法:

espcoredump.py [options] command [args]
Script Options:

–chip,-c {auto,esp32}. 目標芯片類型。支持的值包括 auto 和 esp32。
–port,-p PORT. 串口設備。
–baud,-b BAUD. 當 flashing/reading 時的串口波特率。

Commands:

info_corefile. 恢復 core dump 並打印有用的信息。
dbg_corefile. 恢復 core dump 並使用它啓動 GDB 會話。

Command Arguments:

–gdb,-g GDB. 用於恢復數據的 gdb 的路徑。
–core,-c CORE. 待使用的 core dump 文件的路徑(如果省略,則會從 flash 上面讀取 core dmup)。
–core-format,-t CORE_FORMAT. 指定通過 “-c” 參數傳遞的文件是 ELF (“elf”) 格式,還是 dump 原始二進制格式 (“raw”),還是按照 base64 編碼的(“b64”) 格式。
–off,-o OFF. coredump 分區在 flash 中的偏移(輸入 “make partition_table” 可以直接查看)。
–save-core,-s SAVE_CORE. 將 core 保存到文件中,否則臨時的 core 文件將會被刪除。Ignored with “-c”.
–print-mem,-m 打印內存 dump。值在 “info_corefile” 時有用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章