日期:2014-05-16  浏览次数:21242 次

内存分配当机(malloc_consolidate)
最近程序运行,会比较频繁的当机,查看dump发现当机点总是内存分配函数(malloc_consolidate)。
症状: 函数在malloc_consolidate中不能返回,程序收到 Segmentation fault(11)而当机。
其中一次栈如下:
#0 0x007d5401 in malloc_consolidate () from /lib/libc.so.6
#1 0x007d73bd in _int_malloc () from /lib/libc.so.6
#2 0x007d93ab in malloc () from /lib/libc.so.6
#3 0x00c50aa7 in operator new () from /usr/lib/libstdc++.so.6
#4 0x00c50bdd in operator new[] () from /usr/lib/libstdc++.so.6
#5 0x085af1ef in function5 (this=0xbfdc3864, byteBufLen=1024, bitBufLen=256) at *.cpp:95
#6 0x085af962 in function6 (this=0xbfdc3864) at *.cpp:24
#7 0x0814931d in function7 (this=0x94cba48, user=0x2492f220, npcOid=2483, bAuto=true) at *p.cpp:1787
#8 0x0814af06 in function8 (this=0x94cba48, cre=0x1c6f8550, user=0x2492f220) at *.cpp:1827
#9 0x085b2dee in function9 (this=0x92e8c6c, ev=0x8775100, data=0xbfdc3a20) ...

栈底函数每次相同,但是栈内容从不重复。

网上搜索了一把,众说纷纭,莫衷一是,还请高手现身指点,谢谢。
主要想知道几个要点:
1 是栈越界还是堆越界,为什么这种越界会引起这种问题呢,小弟实在不能理解。
2 怎样从dump文件找出蛛丝马迹,以尽快将真凶缉拿归案呢?



------解决方案--------------------
byteBufLen=1024, bitBufLen=256..这个参数大概是个什么意思。


另外。ev_base::EvMemPacket::SetSize 这个函数是执行到哪里了。是刚进入函数还是已经开始执行函数语句。


你可以先定位一下crash的语句么?
------解决方案--------------------
#3 0x00c50aa7 in operator new () from /usr/lib/libstdc++.so.6
#4 0x00c50bdd in operator new[] () from /usr/lib/libstdc++.so.6

如果这里的new不是你的语句调用的,那就是函数调用过程中的堆栈内存分配失败。


那么你应该检查你调用的函数里,是否有大量的堆栈变量。如果有,应该尽可能改成堆分配。

另外你的程序运行环境是什么平台。有些嵌入式平台非常恶心的。