【ESP32】 內存泄漏Debug方法

    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 選項如下圖進行配置:
menuconfig

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章