vxworks(disable MMU)程序运行到malloc(1024*1024*5)时,出错:
machine check
program counter: 0x793360
machine status: 0x4b000
8286f4 vxTaskEntry +60 : 324ec ([])
722f88 wBufferMemInit+40 : malloc ([])
793444 malloc +1c : memPartAlloc ([])
792e34 memPartAlloc +6c : memPartAlignedAlloc ([])
792c5c memPartAlignedAlloc+19c: 7932a4 ([])
改为malloc(1024*500)以内,正确!
改为malloc(1024*1024*10),也正确!
改为malloc(1024*1024*6),出错!
什么原因呢?
邪了门了
malloc(1024*1024*10)正确
malloc(1024*1024*5)/malloc(1024*1024*6)反而出错?
跑一下这个看看~
- int i = 10;
- void *p;
- for(; i > 0; i--)
- {
- printf("malloc %d...\n", i);
- p = malloc(1024*1024*i);
- printf("free %d...\n", i);
- free(p);
- }
i<10就出错了。
又发现一个现象:先来一个p = malloc(1024*1024*10);不释放p,紧接着运行:
for(; i > 0; i--)
{
printf("malloc %d...\n", i);
p = malloc(1024*1024*i);
printf("free %d...\n", i);
free(p);
}
结果全OK. 怪哉!?
真崩溃~
是不是硬件有问题啊?
换个硬件跑一下试试
这个明显是内存操作异常。具体的说是操作系统仲裁了你对某块内存的操作的非法性,或者说你访问了操作系统认为是非法的区域。
从调用栈的输出来看问题出在memPartAlignedAlloc内。
具体原因等我看看memPartAlignedAlloc的源码再做分析。
目前来看,有点像是VXWORKS的堆管理存在BUG?不过也不排除硬件设计问题对此处的影响。