现象:
今天线上一台服务器的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 ***,转载请注明来源!
不管用
你是说 使用 export MALLOC_CHECK_=0 设置后,依然会有glibc deleted的报错?你设置后,使用 echo $MALLOC_CHECK_ 查看下设置后的值。看是否为0。注意:export 只在本session有效。
使用 export MALLOC_CHECK_=0 设置后,依然会有glibc deleted的报错