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

    文章

    3911

    浏览量

    61313
  • 内存泄漏
    +关注

    关注

    0

    文章

    38

    浏览量

    9167
  • ESP32
    +关注

    关注

    13

    文章

    897

    浏览量

    15858
收藏 人收藏

    评论

    相关推荐

    ESP32 Rev 3内存分配差异是什么?

    能够修改我的代码以不使用太多内存并且问题消失了但是我在电路板上做了一些进一步的实验并且留下了关于旧 ESP32 设备和新设备之间差异的问题。我使用 heap_caps_print_heap_info
    发表于 04-12 06:38

    ESP32硬件设计指南

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

    ESP32硬件设计指南

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

    ESP32环境搭建以及入门编程_esp32引脚图

    本文主要介绍了ESP32环境搭建以及入门编程及ESP32的引脚图。
    发表于 04-23 11:15 1.3w次阅读
    <b class='flag-5'>ESP32</b>环境搭建以及入门编程_<b class='flag-5'>esp32</b>引脚图

    ESP32模组的主要特性

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

    ESP32开发套件 ESP32-DevKitC

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

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

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

    ESP32-C6的特性介绍

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

    ESP32 SDIO 使用教程

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

    ESP32系列芯片的规格

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

    ESP32 WROVER B/ESP32 WROVER IB技术规格书

    电子发烧友网站提供《ESP32 WROVER B/ESP32 WROVER IB技术规格书.pdf》资料免费下载
    发表于 09-23 14:45 1次下载
    <b class='flag-5'>ESP32</b> WROVER B/<b class='flag-5'>ESP32</b> WROVER IB技术规格书

    ESP32 WROVER/ESP32 WROVER IE技术规格书

    电子发烧友网站提供《ESP32 WROVER/ESP32 WROVER IE技术规格书.pdf》资料免费下载
    发表于 09-23 11:28 5次下载
    <b class='flag-5'>ESP32</b> WROVER/<b class='flag-5'>ESP32</b> WROVER IE技术规格书

    ESP32乐鑫开发板

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

    乐鑫ESP32-MINI-1U参考设计

    乐鑫ESP32-MINI-1U参考设计乐鑫多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信SoC,现已发布ESP8266、ESP32
    发表于 10-19 16:13 1次下载

    乐鑫ESP32-MINI-1参考设计

    乐鑫ESP32-MINI-1参考设计乐鑫多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信SoC,现已发布ESP8266、ESP32
    发表于 10-19 16:13 12次下载