在開發中,我們常常會遇到編譯正常,但是運行過程中程序報錯,然后重啟,在這種情況下,又沒法知道是哪段程序引起的,現在我們就來解決這個問題。
其實ESP32的SDK中已經附帶這些debug的工具了。
首先如果我們程序如果運行出錯,那么在串口log中一定會看到dump出的內存地址信息。而我們使用這些信息通過工具就能定位回程序代碼。
在Arduino中程序編譯后會有一個緩存的文件夾,里面包含了編譯的文件,它的路徑類似以下這樣
C:\Users\用戶名\AppData\Local\arduino\sketches\7640961C8FD4426D6DA420FEF9E4113E
其中的“7640961C8FD4426D6DA420FEF9E4113E”是程序生成的,每個人的都不一樣,你可以根據sketches目錄下的文件日期來確定當前最新編譯的是哪個文件夾,通過排序“修改日期”,例如這樣來找到,點進去后里面的文件命名和你的工程命名一樣就是正確的了
進去后我們找到一個文件,你的工程名.ino.elf? 這樣后綴的一個文件,好記錄下這個文件的路徑,以備用
下一步,我們要找到ESP32 SDK工具的路徑,一般在這個路徑下,如果安裝的Arduino IDE的版本不一樣的話,或者ESP32 SDK的版本不一樣的話,這里的路徑中的文件名可能不一樣,但是都大同小異,我們最終要找的執行文件是??riscv32-esp-elf-addr2line.exe,只要確保到是這個exe文件的地址就好了
C:\Users\用戶名\AppData\Local\Arduino15\packages\esp32\tools\esp-rv32\2405\bin
好準備完成,接下來就開始使用了
在控制臺中運行命令
C:\Users\用戶名\AppData\Local\Arduino15\packages\esp32\tools\esp-rv32\2405\bin\riscv32-esp-elf-addr2line.exe -pfiaC -e C:\Users\用戶名\AppData\Local\arduino\sketches\7640961C8FD4426D6DA420FEF9E4113E\你的工程名.ino.elf 0x00060033
按照你的路徑和編譯文件路徑來,最后的0x00060033 是程序出錯串口中log打印出來的地址
一般是traceback? 或者? PC 后面的地址,都可以試試看
然后我們得到的就是具體報錯的代碼的位置了,例如這樣(我這個就是tasks.c文件的3274行代碼報錯)
0x4008faf5: xTaskIncrementTick at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/FreeRTOS-Kernel/tasks.c:3274