This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TCI6636K2H:MultiBufHeap 免费列表损坏

Guru**** 2562120 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/587943/rtos-tci6636k2h-multibufheap-free-list-corruption

器件型号:TCI6636K2H
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我们将 HeapMutiBuf 用于我们的应用。 观察到、有时 HeapMutiBuf 返回 NULL、尽管堆中有可用的可用块(问题是16K 缓冲堆)。

从 ROV (请参阅快照)中、16K 堆的空闲列表似乎已损坏(或显示零)。 我们需要添加一些调试代码来分析免费列表。 但是  、对于每个分配/空闲的所有可用列表缓冲区迭代是不可行的(这是实时应用程序)。 您能告诉我们从哪里可以获得可用列表的内存吗? 它是否保留在某个特定的地址范围内以便可以转储? 或者、缓冲区本身是否保存了一些有关自由列表或下一个自由指针的元数据? 此外、获取信息的任何替代方法都将非常有用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    分配请求是否也有对齐请求? 在确定模块是否可接受时、会将对齐考虑在内。 此外、默认情况下、如果您请求的大小没有块、则不会转到下一个较大的大小。 您可以通过在.cfg 文件中设置 HeapMutiBuf.blockBorrow = true 来启用该选项。 在 alloc 和 free 上都有轻微的性能开销。

    您可以尝试将 HeapTrack 放在 HeapMutiBuf 实例的顶部。 HeapTrack 可捕获双重释放、过度写入分配块的末尾等内容 不过、您可能需要增加每个存储器桶的大小、因为 HeapTrack 会在每个存储器分配中添加24个字节(在 c6xxx 器件上)。

    您也可以使用 HeapCallBack。 然后让函数调用 HeapMultiBuf 实例、但要进行额外的检查。 问题解决后、您可以返回到仅使用 HeapMultiBuf。

    我猜是某种破坏 HeapMultiBuf 对象的行为。 HeapMultiBuf 实例创建后、它看起来是这样吗?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

     感谢您的参与。 blockBorrow 已在我们的应用程序中启用。 我们集成了 HeapTrack 并更改了缓冲区大小、以包含所需的额外24字节。 通过此更改、我们观察  到了应用程序尝试分配内存时出现的异常(地址设置为0x0时除外)。 导致崩溃的函数被跟踪到 BIOS 函数 HeapTrack_Alloc_E 但是、在崩溃之前、还有其他缓冲区是使用 HeapTrack 分配的。 不确定在特定点分配时为何崩溃。 ROV 在 HeapTrack 对象中不显示任何内容并抛出异常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来好像仍在发生损坏。 异常返回跟踪是否为您提供任何信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、

    仅当启用堆跟踪时、我们才会看到此问题。 如果没有启用堆跟踪、我们会看到系统在崩溃前运行几个小时或几天(由于16K 堆损坏)。 但是启用了堆跟踪后、系统几乎立即崩溃(几秒钟内)。 ROV 异常返回跟踪不显示任何内容。

    我们尝试进一步调试此问题、启用了返回挂钩、并观察到崩溃在内部发生 xdc_runtime_IHeap_free ()->ti_sysbios_b堆_HeapTrack_free__E (根据 B3寄存器)。 在应用程序调试中,我们还看到在第一个实例本身调用 Memory_free ()函数时发生崩溃。 我们还检查了在堆分配和释放期间分配的指针和 IHeap_handle、它匹配(即、在内存分配期间分配的指针=0xB9F07100和 IHeap_handle=0xAA7F65A8、在内存空闲函数 Memory_free ()中传递的也是如此)。

    磁芯迹线显示以下错误消息:

    0xa5463298时出现异常
    EFR=0x40000000 NRP=0xa5463298
    UMC 异常 MPFAR=0xc00 MPFSR=0x110
    安全违规、本地 L1/L2高速缓存存储器故障
    监控器写入违反、故障 ID = 0x0

    请告诉我们启用堆跟踪时崩溃的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望您的应用程序具有错误的指针、或者您正在过度编写某些内容。 这可能会损坏堆对象。 启用 HeapTrack 后、可能会很快发生这种情况。 如果是这种情况、我不能为您提供太多指导。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    启用堆跟踪系统在系统初始化阶段本身首次释放堆缓冲时崩溃。 因此、不确定您在应用上的输入是否有错误的指针。

    堆跟踪在 mcsdk [3.1.2.5] 中不起作用。 请检查。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我觉得我不能为线程添加太多内容。 我认为应用程序正在发生一些损坏。 如果您有一个在标准 TI 开发板上重现问题的简单测试用例、我可以尝试查看它。

    Todd