dump log 显示是访问了非法内存地址
Memory Management fault: Data access violation @0x10000a0d
trace 32 解析dump
死机时执行的汇编代码
str r0,[r3] ; pxBlockToInsert,[r3]
查看R3寄存器为 10000A0D
确实访问了内存地址 0x10000A0D
再看调用栈情况
死机位置
prvInsertBlockIntoFreeList
prvInsertBlockIntoFreeList 函数里面,在迭代寻找插入freeblock的位置,访问了0x10000A0D。
!
而0x10000A0D并不是合法的一个8字节对齐的地址, 0x10000A0D & 0x07 = 5,所以会死机。
0x10000A0D 是怎么来的?
pdata = 0x10092C90 的block大小是0x408, 减去header大小8也就是1024字节
dump 0x10092C90 + 1024的内存数据,\r\n 正好是0x0D,0x0A,内存被踩。
1056 字节的数据是怎么来的?
变量 apb_proxy_event_t apb_proxy_event; 未赋值初始化,可能会有问题。
1024 + 32 = 1056
所以死机根本原因是 0x10092C90 这段内存,写超了1024个字节导致。
死机log
对应代码,malloc 是,内存block划分得到的地址没有8字节对齐,触发了assert。
也是内存被破坏的问题。
0x000A0D34 怎么来的?
A*34\r\n 正好是0A 0D 34,猜测也是内存overwrite问题。
死机log
也是内存被踩问题。