0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32內(nèi)存泄露

jf_78858299 ? 來(lái)源:紛紜雜談 ? 作者:CY_CHEN ? 2023-05-22 16:18 ? 次閱讀

使用ESP32時(shí)如果懷疑存在內(nèi)存泄漏,第一步是找出程序的哪個(gè)部分正在泄漏內(nèi)存。使用xPortGetFreeHeapSize()、heap_caps_get_free_size()或相關(guān)函數(shù)來(lái)跟蹤應(yīng)用程序生命周期內(nèi)的內(nèi)存使用情況。嘗試將泄漏縮小到單個(gè)函數(shù)或函數(shù)序列,在這些函數(shù)中,可用內(nèi)存總是減少并且永遠(yuǎn)不會(huì)恢復(fù)。

一旦確定了正在泄漏的代碼:

·在項(xiàng)目配置菜單中,導(dǎo)航到Component settings -> Heap Memory Debugging -> Heap tracing,選擇Standalone選項(xiàng)。

圖片

·在程序運(yùn)行前調(diào)用heap_trace_init_standalone() 注冊(cè)一個(gè)可用于記錄內(nèi)存跟蹤的緩沖區(qū)。

·調(diào)用 heap_trace_start()開(kāi)始記錄系統(tǒng)中的所有malloc/free。在你懷疑正在泄漏內(nèi)存的代碼段之前立即調(diào)用此方法。

·調(diào)用heap_trace_stop()在懷疑代碼段完成執(zhí)行后停止跟蹤。

·調(diào)用 heap_trace_dump()轉(zhuǎn)儲(chǔ)堆跟蹤的結(jié)果。

示例代碼:

#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


...


void app_main()
{
    ...
    ESP_ERROR_CHECK( heap_trace_init_standalone(trace_record, NUM_RECORDS) );
    ...
}


void some_function()
{
    ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) );


    do_something_you_suspect_is_leaking();


    ESP_ERROR_CHECK( heap_trace_stop() );
    heap_trace_dump();
    ...
}

堆跟蹤的輸出大概這樣:

2 allocations trace (100 entry buffer)
32 bytes (@ 0x3ffaf214) allocated CPU 0 ccount 0x2e9b7384 caller 0x400d276d:0x400d27c1
0x400d276d: leak_some_memory at /path/to/idf/examples/get-started/blink/main/./blink.c:27


0x400d27c1: blink_task at /path/to/idf/examples/get-started/blink/main/./blink.c:52


8 bytes (@ 0x3ffaf804) allocated CPU 0 ccount 0x2e9b79c0 caller 0x400d2776:0x400d27c1
0x400d2776: leak_some_memory at /path/to/idf/examples/get-started/blink/main/./blink.c:29


0x400d27c1: blink_task at /path/to/idf/examples/get-started/blink/main/./blink.c:52


40 bytes 'leaked' in trace (2 allocations)
total allocations 2 total frees 0

上面的示例輸出是使用IDF監(jiān)視器自動(dòng)解碼PC地址到它們的源文件和行號(hào)。

第一行表示與緩沖區(qū)的總大小相比,緩沖區(qū)中有多少分配項(xiàng)。

在HEAP_TRACE_LEAKS模式下,對(duì)于每個(gè)尚未釋放的跟蹤內(nèi)存分配,打印一行:

  • XXbytes 為已分配的字節(jié)數(shù)
  • @0x... 是從malloc/calloc返回的堆地址。
  • InternalPSRAM 是分配內(nèi)存的一般位置。
  • CPUx CPU x是分配時(shí)正在運(yùn)行的CPU(0或1)。
  • ccount0x... 是分配模式時(shí)的CCOUNT (CPU周期計(jì)數(shù))寄存器值。不同于CPU 0和CPU 1。
  • caller0x... 給出調(diào)用malloc()/free()的調(diào)用堆棧,作為PC地址列表??梢詫⑺鼈兘獯a為源文件和行號(hào)。

可以在項(xiàng)目配置菜單中Heap Memory Debugging -> Enable heap tracing -> Heap tracing stack depth配置為每個(gè)跟蹤項(xiàng)記錄的調(diào)用堆棧的深度。每個(gè)分配最多可以記錄10個(gè)堆棧幀(默認(rèn)為2個(gè))。每增加一個(gè)堆棧幀,每個(gè)heap_trace_record_t記錄的內(nèi)存使用都會(huì)增加8個(gè)字節(jié)。

最后,打印內(nèi)存泄漏字節(jié)的總數(shù)(在運(yùn)行跟蹤時(shí)已分配但未釋放的字節(jié)),以及它所表示的總分配數(shù)。如果跟蹤緩沖區(qū)的大小不足以容納發(fā)生的所有分配,則將打印警告。如果看到此警告,應(yīng)該縮短跟蹤周期或增加跟蹤緩沖區(qū)中的記錄數(shù)量。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
  • 內(nèi)存泄漏
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    9185
  • ESP32
    +關(guān)注

    關(guān)注

    17

    文章

    936

    瀏覽量

    16662
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用ESP32實(shí)現(xiàn)藍(lán)牙通信

    上次給大家分享了如何使用ESP32實(shí)現(xiàn)UDP通信,今天跟大家聊聊如何使用ESP32實(shí)現(xiàn)藍(lán)牙通信。
    發(fā)表于 11-21 09:31 ?1.5w次閱讀

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf進(jìn)行esp32開(kāi)發(fā)的教程
    的頭像 發(fā)表于 06-03 09:39 ?4143次閱讀
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf進(jìn)行esp32開(kāi)發(fā)的教程
    的頭像 發(fā)表于 06-13 09:04 ?6144次閱讀
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    ESP32硬件設(shè)計(jì)指南

    不同的物聯(lián)網(wǎng)應(yīng)用場(chǎng)景使用。相較上一代芯片 ESP8266,ESP32 有更多的內(nèi)存空間供用戶使用,且有更多的 I/O 口可供開(kāi)發(fā)。ESP32可以直接傳送視頻數(shù)據(jù),功耗也相對(duì)要低一些,還
    的頭像 發(fā)表于 03-08 14:52 ?1w次閱讀

    ESP32硬件設(shè)計(jì)指南

    不同的物聯(lián)網(wǎng)應(yīng)用場(chǎng)景使用。相較上一代芯片 ESP8266,ESP32 有更多的內(nèi)存空間供用戶使用,且有更多的 I/O 口可供開(kāi)發(fā)。ESP32可以直接傳送視頻數(shù)據(jù),功耗也相對(duì)要低一些,還
    的頭像 發(fā)表于 12-27 22:27 ?2619次閱讀
    <b class='flag-5'>ESP32</b>硬件設(shè)計(jì)指南

    ESP32模組的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型開(kāi)發(fā)板,集WIFI+藍(lán)牙方案于一體,板上模組絕大部分管腳均已引出,開(kāi)發(fā)人員可根據(jù)實(shí)際需求,輕松通過(guò)跳線連接多種外圍器件,或?qū)㈤_(kāi)發(fā)板直接
    發(fā)表于 11-04 14:54 ?3786次閱讀

    ESP32開(kāi)發(fā)套件 ESP32-DevKitC

    今天推出的一款套件是來(lái)自全球創(chuàng)客屆大名鼎鼎的樂(lè)鑫科技官方提供的經(jīng)典ESP32開(kāi)發(fā)套件 -?ESP32-DevKitC。 它基于樂(lè)鑫ESP32控制器(32-bit MCU 2.4 GHz Wi-Fi
    的頭像 發(fā)表于 01-06 16:55 ?8136次閱讀

    ESP32-WROOM-32E和ESP32-WROOM-32UE模組的區(qū)別

    ESP32-WROOM系列模組基于 ESP32-D0WD 雙核芯片設(shè)計(jì),適用于基于 Wi-Fi 和藍(lán)牙連接的應(yīng)用場(chǎng)景,具備強(qiáng)大的雙核性能。而其中的ESP32
    發(fā)表于 06-01 16:41 ?1.8w次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模組的區(qū)別

    esp32和arduino的區(qū)別,esp32能否替代arduino

    很多創(chuàng)客愛(ài)好者甚至有些技術(shù)工程師在理解esp32和arduino的時(shí)候總是問(wèn)一句這兩塊板子哪個(gè)更好用?他們可能潛意識(shí)中就覺(jué)得arduino和esp32是競(jìng)品的關(guān)系,但實(shí)際是這樣嗎?今天我們就深入
    發(fā)表于 06-24 17:11 ?2.6w次閱讀

    ESP32-C6的特性介紹

    說(shuō)到ESP32-C3,大家耳熟能詳,其實(shí)ESP32-C6 的 CPU、內(nèi)存和安全性能與 ESP32-C3 相似。它搭載 RISC-V 32 位單核處理器,時(shí)鐘頻率高達(dá) 160 MHz,
    發(fā)表于 06-29 14:53 ?2243次閱讀

    ESP32 開(kāi)發(fā)之旅② Arduino For ESP32說(shuō)明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫(kù)3.與ESP8266庫(kù)類比3.1 WiFi —— ESP
    發(fā)表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開(kāi)發(fā)之旅② Arduino For <b class='flag-5'>ESP32</b>說(shuō)明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在說(shuō)明如何使用標(biāo)準(zhǔn)的 ESP32-WROOM-32D 開(kāi)發(fā)板進(jìn)行 SDIO 的通信。本文檔適用于所有需要與 ESP32 SDIO slave 通信的方案
    發(fā)表于 11-23 17:51 ?233次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32系列芯片的規(guī)格

    ESP32是一款2.4GHz Wi-Fi和藍(lán)牙組合芯片,采用TSMC超低功耗40nm設(shè)計(jì)技術(shù)它旨在實(shí)現(xiàn)最佳功率和射頻性能,顯示出魯棒性、多功能性和靈活性在各種應(yīng)用和電源場(chǎng)景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    發(fā)表于 04-25 16:21 ?7次下載

    ESP32ESP32通過(guò)Internet進(jìn)行通信

    電子發(fā)燒友網(wǎng)站提供《ESP32ESP32通過(guò)Internet進(jìn)行通信.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:58 ?4次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過(guò)Internet進(jìn)行通信

    esp8266和esp32區(qū)別是什么

    Xtensa? 32-bit LX6 CPU,主頻可達(dá)240MHz,具有更強(qiáng)大的處理能力。 內(nèi)存ESP8266 :通常有64KB到512KB的RAM,以及1MB到4MB的閃存。 ESP32 :提供更大
    的頭像 發(fā)表于 08-19 18:16 ?1417次閱讀