malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed
使用的平台是ubuntu 10.04 gcc 4.4.3 编译选项没有开优化(gcc在开优化后做了挺多事情的) -O0
脑中觉得无解之后只好寻求网上大神指导,在stackoverflow中发现了一个神奇的工具:Valgrind。这是一个 Linux下的开源仿真调试工具集合体。具体原理可以百度一下,这里我说一下简单的安装和使用以及如何找到找到问题并解决的。
我从官网 http://valgrind.org/ 上下载了至今最新的版本 3.10.1,解压后进入Valgrind根目录查看README文件进行configure, make , make install常规安装。第一步就算是完成了,运行Valgrind --tool=memcheck 文件路径 命令后得到如下结果:
从Valgrind反馈的信息来看就是就是写内存越界的问题导致的,果然,按照这个方向检查程序发现了一个细微的地方导致内存写入长度有误。不得不感叹工欲善其事,必先利其器啊。
内存检查只是Valgrind工具的一个基本功能点,其余的强大功能等以后用得着了再放在博客上...