首页 » 编程语言 » c&c++ » *** glibc detected ***

*** glibc detected ***

 

现象:
今天线上一台服务器的php打算升级到php5.5,导入流量后,在php的error log中出现了一些 glibc delected错误。
如:
*** glibc detected *** ./test: double free or corruption (fasttop): 0x00000000049cc010 ***

原因:
重复free

示例:

#include"stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "netdb.h"
#include "sys/types.h"
#include "netinet/in.h"
#include<sys/types.h>  /*提供类型pid_t,size_t的定义*/
#include<sys/stat.h>
#include<fcntl.h>
int main (int argc, char *argv[]){
	char *chr;
	chr = (char *)malloc(10*sizeof(char));
	free(chr);
	free(chr);
}

上面的代码编译后,执行会出现如下错误:

[root@localhost c]# gcc ./test.c -o ./test
[root@localhost c]# ./test
*** glibc detected *** ./test: double free or corruption (fasttop): 0x00000000049cc010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3dfbc7166f]
/lib64/libc.so.6(cfree+0x4b)[0x3dfbc7589b]
./test[0x400507]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x3dfbc1d9c4]
./test[0x400429]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fd:00 1081356                            /root/test/c/test
00600000-00601000 rw-p 00000000 fd:00 1081356                            /root/test/c/test
049cc000-049ed000 rw-p 049cc000 00:00 0                                  [heap]
3dfb800000-3dfb81c000 r-xp 00000000 fd:00 1736741                        /lib64/ld-2.5.so
3dfba1c000-3dfba1d000 r--p 0001c000 fd:00 1736741                        /lib64/ld-2.5.so
3dfba1d000-3dfba1e000 rw-p 0001d000 fd:00 1736741                        /lib64/ld-2.5.so
3dfbc00000-3dfbd4f000 r-xp 00000000 fd:00 1736747                        /lib64/libc-2.5.so
3dfbd4f000-3dfbf4e000 ---p 0014f000 fd:00 1736747                        /lib64/libc-2.5.so
3dfbf4e000-3dfbf52000 r--p 0014e000 fd:00 1736747                        /lib64/libc-2.5.so
3dfbf52000-3dfbf53000 rw-p 00152000 fd:00 1736747                        /lib64/libc-2.5.so
3dfbf53000-3dfbf58000 rw-p 3dfbf53000 00:00 0 
3e0d200000-3e0d20d000 r-xp 00000000 fd:00 1736868                        /lib64/libgcc_s-4.1.2-20080825.so.1
3e0d20d000-3e0d40d000 ---p 0000d000 fd:00 1736868                        /lib64/libgcc_s-4.1.2-20080825.so.1
3e0d40d000-3e0d40e000 rw-p 0000d000 fd:00 1736868                        /lib64/libgcc_s-4.1.2-20080825.so.1
2ae478170000-2ae478172000 rw-p 2ae478170000 00:00 0 
2ae478185000-2ae478186000 rw-p 2ae478185000 00:00 0 
7fff3d24b000-7fff3d260000 rw-p 7ffffffe9000 00:00 0                      [stack]
7fff3d34e000-7fff3d352000 r-xp 7fff3d34e000 00:00 0                      [vdso]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vsyscall]
Aborted

方案:
在默认的情况下,产生这个错误的程序也会被中止。但是,这(以及是否产生错误信息)可以通过环境变量 MALLOC_CHECK_ 来控制。以下的设置是被支持的:
0 — 不产生错误信息,也不中止这个程序
1 — 产生错误信息,但是不中止这个程序
2 — 不产生错误信息,但是中止这个程序
3 — 产生错误信息,并中止这个程序
备注
如果 MALLOC_CHECK_ 被设置为除 0 以外的值,这会使 glibc 进行更多的检查并可能影响到系统的性能。
export MALLOC_CHECK_=0

类似的错误还有:
*** glibc detected *** php-fpm: pool www: corrupted double-linked list: 0x0000000002150b10 ***"

技术交流

原文链接:*** glibc detected ***,转载请注明来源!

原文链接:*** glibc detected ***,转载请注明来源!

1