malloc导致core dump

来源:互联网 发布:淘宝账号怎么升级心 编辑:程序博客网 时间:2024/06/05 21:02

一次很偶然的机会,发现在调用某个函数的时候,发生core dump的情况。用gdb的bt命令没看出啥来,用x/20x value查看,发现在调用malloc函数时,x/20x value的内存发生改变了,很显然,这个不太可能,实在百思不得其解。只好在每个关键地方都调用malloc来逼近问题最接近的地方。最后,发现有个地方使用malloc(sizeof(var))来分配内存,却使用memset(var , 0 , sizeof(var_t))来清空内存,导致内存溢出。

 

这里用到了几个技巧值得记录下:

1、gdb 来确定core dump的地方

2、由于原因不在发生core dump的地方,所有用内存检查的方式来确定发生内存变化的地方。

3、确定malloc导致内存发生变化,使用malloc尽早的引起core dump,来逼近最根本的地方。

4、通过大范围到小范围多层次来逼近问题的根本原因。

===================

在64位机器上,调用malloc会出现coredump的问题

 

可能有下面的原因:

 

     malloc在stdlib.h中的原型为:

 

     void *malloc (size_t size);

 

     如果没有包含头文件,函数没有声明就直接使用,那么C语言默认函数的返回值是int型,即如果没有包含头文件,那么malloc函数的原型为:

     int malloc(size_t size);

 

      如果编译成64位的应用程序,那么sizeof(int) = 4并且sizeof(void *) = 8, 比如malloc本来返回的地址为0xFFFFFFFFFFFF1111, 由于没有函数声明,系统默认malloc返回的类型为int,将上面的地址高32位截取后就得到0xFFFF11111,即对malloc返回值的任何操作都是在地址0xFFFF11111上做的。如果0xFFFF1111这个地址不可写,那么就会导致coredump的情况。

 

       如果编译成32位的应用程序,那么sizeof(int) = sizeof(void*) = 4,所以不会出现coredump问题。

       可能还有其他方面的原因。

 

 解决方法:

     在程序中,添加stdlib.h头文件


原创粉丝点击