[筆記] ESP32 apptrace logging 方便於除錯
開發設計任何系統,日誌 logging 是很重要的基礎工作。少了日誌,系統出錯將不容易除錯、分析、解決問題,所以第一步要先學會如何產生日誌。在開發 ESP32 / Arduino 這類系統時,一般常見產生日誌的方法是呼叫 printf 函數將想要紀錄的內容傳到 UART 介面,再從電腦的 COM port 上來查看。
採用 printf 將日誌輸出到 COM port 雖然簡單方便,但是呼叫過多的 printf 會影響運算的 timing,也不適合輸出大量數據到日誌。還有,當遇到系統崩潰的問題時,COM port 方式是很難幫我們解決這類棘手問題的。因此,ESP-IDF 提供另一種方式 apptrace 應用層追蹤函數庫 [2],日誌資料先存放到記憶體,再透過 OpenOCD 傳送到 PC 端。底下,我們以 blink 範例說明產生 apptrace 日誌的步驟。
首先,在 VS Code 的項目中打開 SDK 配置,如圖一所示。左下角的圖示按下,出現 SDK 配置後,找到 "Application Level Tracking" 選項,將選單設為 Trace memory,儲存後再編譯 blink 範例。
圖一:開啟日誌系統的配置 |
第二步,在程式碼中,我們可以設定日誌輸出到 COM port 或者輸出到 OpenOCD 的電腦端。如圖二所示,當呼叫 esp_log_set_vprintf( esp_apptrace_vprintf ) 時,代表之後的日誌都會輸出到 OpenOCD,所以紅色標示的日誌資料會輸出到電腦端。程式碼需要定期再加呼叫 esp_apptrace_flash 才能將日誌輸出。
當呼叫 esp_log_set_vprintf( vprintf ) 時,代表之後的日誌輸出到 COM port,我們在電腦端直接打開終端機連線(115200bps 8-N-1)就能看到日誌,下圖所示。
圖二:在程式碼新增日誌 |
程式碼已經調用了 apptrace 函數庫,但是還沒真正讀取到日誌資料或開啟日誌。我們必須在電腦端打開 telnet 連線到 OpenOCD,連線參數:telnet localhost 4444。連線成功後,輸入 esp apptrace start file://blink.log,這樣透過 OpenOCD 便開啟日誌並寫入電腦的 blink.log 檔案。若要停止日誌,輸入 esp apptrace stop 便不會再寫入檔案了。
最後一步,取得 blink.log 日誌後,直接打開看到的是一堆亂碼,我們需要執行轉換工具才能看到真正的日誌內容。打開 command-line,到 esp-idf 目錄下執行 export.bat,便會設定好環境變數,如下圖所示。然後到 \tools\esp_app_trace 目錄下執行 logtrace_proc.py blink.log blink.elf,就可看到日誌內容了,記得將編譯產出的 elf 檔案和日誌檔案準備好,轉換如下圖四所示。觀察日誌內容 "Turning off the LED" 這段文字出現在 apptrace 日誌裡,而 "Turning on the LED" 只會出現在 COM port 中,代表我們成功將日誌內容分流了。
圖三:設定 ESP-IDF 環境變數 |
圖四:執行日誌轉換工具 |
參考資料
[2] ESP-IDF 應用層追蹤庫
留言