0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32内存泄露

jf_78858299 来源:纷纭杂谈 作者:CY_CHEN 2023-05-22 16:18 次阅读

使用ESP32时如果怀疑存在内存泄漏,第一步是找出程序的哪个部分正在泄漏内存。使用xPortGetFreeHeapSize()、heap_caps_get_free_size()或相关函数来跟踪应用程序生命周期内的内存使用情况。尝试将泄漏缩小到单个函数或函数序列,在这些函数中,可用内存总是减少并且永远不会恢复。

一旦确定了正在泄漏的代码:

·在项目配置菜单中,导航到Component settings -> Heap Memory Debugging -> Heap tracing,选择Standalone选项。

图片

·在程序运行前调用heap_trace_init_standalone() 注册一个可用于记录内存跟踪的缓冲区。

·调用 heap_trace_start()开始记录系统中的所有malloc/free。在你怀疑正在泄漏内存的代码段之前立即调用此方法。

·调用heap_trace_stop()在怀疑代码段完成执行后停止跟踪。

·调用 heap_trace_dump()转储堆跟踪的结果。

示例代码:

#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监视器自动解码PC地址到它们的源文件和行号。

第一行表示与缓冲区的总大小相比,缓冲区中有多少分配项。

在HEAP_TRACE_LEAKS模式下,对于每个尚未释放的跟踪内存分配,打印一行:

  • XXbytes 为已分配的字节数
  • @0x... 是从malloc/calloc返回的堆地址。
  • InternalPSRAM 是分配内存的一般位置。
  • CPUx CPU x是分配时正在运行的CPU(0或1)。
  • ccount0x... 是分配模式时的CCOUNT (CPU周期计数)寄存器值。不同于CPU 0和CPU 1。
  • caller0x... 给出调用malloc()/free()的调用堆栈,作为PC地址列表。可以将它们解码为源文件和行号。

可以在项目配置菜单中Heap Memory Debugging -> Enable heap tracing -> Heap tracing stack depth配置为每个跟踪项记录的调用堆栈的深度。每个分配最多可以记录10个堆栈帧(默认为2个)。每增加一个堆栈帧,每个heap_trace_record_t记录的内存使用都会增加8个字节。

最后,打印内存泄漏字节的总数(在运行跟踪时已分配但未释放的字节),以及它所表示的总分配数。如果跟踪缓冲区的大小不足以容纳发生的所有分配,则将打印警告。如果看到此警告,应该缩短跟踪周期或增加跟踪缓冲区中的记录数量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4326

    浏览量

    62558
  • 内存泄漏
    +关注

    关注

    0

    文章

    39

    浏览量

    9213
  • ESP32
    +关注

    关注

    18

    文章

    969

    浏览量

    17194
收藏 人收藏

    评论

    相关推荐

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-03 09:39 4482次阅读
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-13 09:04 6690次阅读
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    ESP32硬件设计指南

    不同的物联网应用场景使用。相较上一代芯片 ESP8266,ESP32 有更多的内存空间供用户使用,且有更多的 I/O 口可供开发。ESP32可以直接传送视频数据,功耗也相对要低一些,还
    的头像 发表于 03-08 14:52 1w次阅读

    ESP32硬件设计指南

    不同的物联网应用场景使用。相较上一代芯片 ESP8266,ESP32 有更多的内存空间供用户使用,且有更多的 I/O 口可供开发。ESP32可以直接传送视频数据,功耗也相对要低一些,还
    的头像 发表于 12-27 22:27 2691次阅读
    <b class='flag-5'>ESP32</b>硬件设计指南

    ESP32模组的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型开发板,集WIFI+蓝牙方案于一体,板上模组绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板直接
    发表于 11-04 14:54 3980次阅读

    ESP32开发套件 ESP32-DevKitC

    今天推出的一款套件是来自全球创客届大名鼎鼎的乐鑫科技官方提供的经典ESP32开发套件 - ESP32-DevKitC。 它基于乐鑫ESP32控制器(32-bit MCU 2.4 GHz Wi-Fi
    的头像 发表于 01-06 16:55 8390次阅读

    ESP32-WROOM-32E和ESP32-WROOM-32UE模组的区别

    ESP32-WROOM系列模组基于 ESP32-D0WD 双核芯片设计,适用于基于 Wi-Fi 和蓝牙连接的应用场景,具备强大的双核性能。而其中的ESP32
    发表于 06-01 16:41 1.9w次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模组的区别

    esp32和arduino的区别,esp32能否替代arduino

    很多创客爱好者甚至有些技术工程师在理解esp32和arduino的时候总是问一句这两块板子哪个更好用?他们可能潜意识中就觉得arduino和esp32是竞品的关系,但实际是这样吗?今天我们就深入
    发表于 06-24 17:11 2.7w次阅读

    ESP32-C6的特性介绍

    说到ESP32-C3,大家耳熟能详,其实ESP32-C6 的 CPU、内存和安全性能与 ESP32-C3 相似。它搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,
    发表于 06-29 14:53 2385次阅读

    ESP32 开发之旅② Arduino For ESP32说明

    文章目录1. Arduino Core For ESP32是什么?2.Arduino core for ESP32库3.与ESP8266库类比3.1 WiFi —— ESP
    发表于 11-13 19:51 33次下载
    <b class='flag-5'>ESP32</b> 开发之旅② Arduino For <b class='flag-5'>ESP32</b>说明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在说明如何使用标准的 ESP32-WROOM-32D 开发板进行 SDIO 的通信。本文档适用于所有需要与 ESP32 SDIO slave 通信的方案
    发表于 11-23 17:51 233次下载
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32系列芯片的规格

    ESP32是一款2.4GHz Wi-Fi和蓝牙组合芯片,采用TSMC超低功耗40nm设计技术它旨在实现最佳功率和射频性能,显示出鲁棒性、多功能性和灵活性在各种应用和电源场景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    发表于 04-25 16:21 7次下载

    ESP32乐鑫开发板

    C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。E
    的头像 发表于 12-05 16:00 1495次阅读

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 4次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet进行通信

    esp8266和esp32区别是什么

    Xtensa® 32-bit LX6 CPU,主频可达240MHz,具有更强大的处理能力。 内存ESP8266 :通常有64KB到512KB的RAM,以及1MB到4MB的闪存。 ESP32 :提供更大
    的头像 发表于 08-19 18:16 5162次阅读