最近公司产品出现了一个奇怪的错误,当用户提交数据超过某个限制时会出现“Critical failure,please conntact support!”的错误,刚开始以为是因为用户页面提交时的冗余信息过多,于是把一些提交时不用的数据在提交之前做了清空处理,但是这一招并不是太灵,对于有些页面是无效的,于是就在web服务器上找原因,DEBUG结果发现当提交数据较多时,有一个函数进入时是有参数传入的,然而到下面用这个实参给其他变量赋值的时候这个实参的值却不见了,对应的内存区块被置为了‘\0’,百思不得其解,各种DEBUG,原来是因为程序malloc时形参所在的结构体内存与后来的malloc重叠了,当较大的变量进行memset时,较小的变量内容也被置为了'\0',查看malloc的man page想看这个函数有没有什么BUG,有用的是下面这段
-
By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available.
大致意思就是说malloc返回值即使不是NULL也不一定可用,没办法只能想办法用其他的动态分配内存方法代替malloc了,尝试了使用alloca()等等,最后选择了mmap()
-
mmap(NULL,sizeof(SessionDetails), PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,-1,0);
这个方法有点弊端就是内存分配的对齐是按页对齐(我所使用的系统是4K)的,结果就是可能比较浪费内存了
阅读(3410) | 评论(0) | 转发(0) |