ESP32 記憶體洩漏Debug方法

2021-09-27 05:59:47 字數 1694 閱讀 8433

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 #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*************************

love and share.  peace.

esp32之記憶體洩漏檢測機制

在freertos嵌入式實時系統上開發,經常需要對記憶體進行優化,或者因使用不當造成記憶體洩漏 最難受的莫過於某個庫出現記憶體洩漏 人為記憶體洩漏比較容易找出來,但是函式庫存在記憶體洩漏卻是很難發現,作者在解決記憶體洩漏的過程中也遇到不少坑,難以定位問題存在。試想有一種方法可以在 開發階段實時除錯記...

ESP32模組比較

esp32系列無線ic是樂鑫espressif出品的價效比高的藍芽wifi雙模ic。官網 最詳細的手冊文件為 esp32 technical reference manual cn.pdf 將官方和一些其他方的模組列表比較,包括資源,也把晶元放進去。esp32單核晶元用的少沒有列出。可以看出,安信可...

ESP32 學習記錄

首次接觸freertos和espressif的產品,例如我,那還是要先來個整體印象,然後再逐個深化。做專案的都知道,老闆們是不允許我們四平八穩的研究完然後再開始專案。那也不妨礙咱們要有自己的節奏,既要平衡專案的進度,也要按照事情的規律來做事情 這就需要快速的準備一些預備知識,磨刀不誤砍柴功,倉促上陣...