一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

ESP32內(nèi)存泄露

jf_78858299 ? 來源:紛紜雜談 ? 作者:CY_CHEN ? 2023-05-22 16:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

圖片

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

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

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

·調(diào)用 heap_trace_dump()轉(zhuǎn)儲堆跟蹤的結(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)視器自動解碼PC地址到它們的源文件和行號。

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

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

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

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

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

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

    關(guān)注

    3

    文章

    4379

    瀏覽量

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

    關(guān)注

    0

    文章

    40

    瀏覽量

    9388
  • ESP32
    +關(guān)注

    關(guān)注

    21

    文章

    1015

    瀏覽量

    19209
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    使用ESP32實現(xiàn)藍牙通信

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

    [esp32教程] 5、UART使用

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

    ESP32硬件設(shè)計指南

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

    ESP32硬件設(shè)計指南

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

    ESP32模組的主要特性

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

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

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

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

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

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

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

    ESP32-C6的特性介紹

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

    ESP32 開發(fā)之旅② Arduino For ESP32說明

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

    ESP32 SDIO 使用教程

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

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

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

    ESP32ESP32通過Internet進行通信

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

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

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

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本質(zhì)上是讓 ESP32 設(shè)備與豆包的 API 進行通信,以獲取相關(guān)服務(wù)
    的頭像 發(fā)表于 02-05 13:40 ?1941次閱讀
    <b class='flag-5'>esp32</b>如何接入豆包