ESP32 是 Espressif 設計的,在物聯網應用中非常流行的 Wi-Fi / Bluetooth(BLE) 雙模芯片,其開源IDF的方式也在開發者社區(Github)具有重要的影響力。對於程序設計而言,也相當友好。而內存泄漏作爲一個非常常見的問題被相當多的朋友遇到,它關乎代碼邏輯是否正確、以及最重要的——是否細心...好了,廢話不多說,本文主要介紹一種 ESP32 提供的一種可以迅速、準確定位內存泄漏的方法。
在介紹定位爲方法之前,首先,用戶應該正確地判斷問題是否真的是內存泄漏。判斷方法有兩種:
1. ESP32的Bug打印;(運行時根據log打印判斷)
2. 使用ESP操作系統的API:
esp_get_free_heap_size()
打印出當前內存剩餘情況,可以在代碼的開始和結束兩處代碼分別打印,並根據代碼本身的功能狀況進行判斷。
printf("%s buffer get: %d\n",__func__, esp_get_free_heap_size());
經過上面的判斷,若問題真的由內存泄漏導致,那麼可以進行以下操作:
1. 配置Heap Trace:
a. 在Terminal 進入配置界面: $ make menuconfig
b. 在 component -> Heap Memory Debugging 選項如下圖進行配置:
2.在代碼開始處進行以下操作:
/* 需要包含的 頭文件 以及 宏定義 */
#ifdef CONFIG_HEAP_TRACING
#include <esp_heap_trace.h>
#define NUM_RECORDS 100
static heap_trace_record_t trace_record[NUM_RECORDS]; // This buffer must be in internal RAM
#endif
...
/* 代碼開始處 */
ESP_ERROR_CHECK(heap_trace_init_standalone(trace_record,NUM_RECORDS));
ESP_ERROR_CHECK(heap_trace_start(HEAP_TRACE_LEAKS));
...
在代碼報錯處加以下代碼:
/* 代碼出錯處 */
...
printf("%s buffer get: %d\n",__func__, esp_get_free_heap_size());
ESP_ERROR_CHECK(heap_trace_stop());
heap_trace_dump();
...
在Terminal內會精確到行數,並打印如下圖:
後續便可以根據這個backtrace打印進行代碼追蹤,找到內存泄漏的地方。
=====================THE END=========================
如果覺得有用,請點贊、收藏、關注、或轉發給你覺得有用的人。
本帳號會不定期記錄與ESP-IDF調試小技巧,或者其他功能模塊介紹。
LOVE AND SHARE. PEACE.