现象:
运行时崩溃 ,根据打印的寄存器信息,回溯到 malloc->LOS_MemAlloc()函数, 线程栈信息 水线显示将要溢出;
多次测试发现不止一个在线程和函数里崩溃 ,栈信息看起来要溢出, 栈回溯都是指向malloc函数。
过程:
liteos目录有 osShellCmdMemCheck函数, 将会检查 malloc内部堆结点的一致性,不一致将会打印异常;
在多个关键节点处添加了osShellCmdMemCheck检查 内存堆的状态,以及关键点的打印后,osShellCmdMemCheck确实有打印堆异常 和上一次哪个线程申请的动态内存,但难定位到具体是哪里引起, 因为出错的线程和函数栈可能每次都不一样。
经过对崩溃时机的分析和对动态内存方面的代码审查,最终发现是某块malloc的内存越界使用,破坏了其他内存节点。导致其他地方在调用malloc的时候崩溃 。
总结:
多线程的原因,在 某线程踩了内存后,malloc申请的内存块及相邻节点被破坏,其他线程的函数谁调用malloc谁先死掉。