一次LiteOS运行时崩溃的解决

现象:

运行时崩溃 ,根据打印的寄存器信息,回溯到 malloc->LOS_MemAlloc()函数, 线程栈信息 水线显示将要溢出; 

多次测试发现不止一个在线程和函数里崩溃 ,栈信息看起来要溢出, 栈回溯都是指向malloc函数。

过程:

liteos目录有 osShellCmdMemCheck函数, 将会检查 malloc内部堆结点的一致性,不一致将会打印异常;

在多个关键节点处添加了osShellCmdMemCheck检查 内存堆的状态,以及关键点的打印后,osShellCmdMemCheck确实有打印堆异常 和上一次哪个线程申请的动态内存,但难定位到具体是哪里引起, 因为出错的线程和函数栈可能每次都不一样。

经过对崩溃时机的分析和对动态内存方面的代码审查,最终发现是某块malloc的内存越界使用,破坏了其他内存节点。导致其他地方在调用malloc的时候崩溃 。

总结:

多线程的原因,在 某线程踩了内存后,malloc申请的内存块及相邻节点被破坏,其他线程的函数谁调用malloc谁先死掉。

猜你喜欢

转载自blog.csdn.net/konga/article/details/84194399