php 检测内存泄露,用valgrind检测php扩展内存泄露_PHP教程

原文:https://bugs.php.net/bugs-getting-valgrind-log.php

前提

1,编译php的时候,必须要带上--enable-debug选项。

2,禁用php的内存管理。

禁用Zend MM

Zend虚拟机使用了自己的程序来优化内存管理,因此,valgrind无法探测到大部分的内存问题。在使用valgrind执行php之前,你必须禁用Zend自带的内存管理器。禁用方式为将环境变量USE_ZEND_ALLOC设置成0。

export USE_ZEND_ALLOC=0

或者

setenv USE_ZEND_ALLOC 0

上述方式适用于php5.2及以上的版本。5.2之前的php需要在编译的时候带上--disable-zend-memory-manager选项。

使用共享扩展

为了能在valgrind中正确显示extension的内存堆栈,需要设置:

export ZEND_DONT_UNLOAD_MODULES=1

或者

setenv ZEND_DONT_UNLOAD_MODULES 1

该设置作用于PHP 5.3.11及之后的版本。

编者注:举例来说,如果不设置ZEND_DONT_UNLOAD_MODULES,valgrind可能会报告

$ valgrind --leak-check=full --show-reachable=yes php test.php

...

==25829== 8 bytes in 1 blocks are indirectly lost in loss record 2 of 21

==25829== at 0x4C25E84: ???

==25829== by 0xCE440DC: ???

==25829== by 0xCE44316: ???

==25829== by 0xCE44368: ???

==25829== by 0xCBEE55F: ???

==25829== by 0xCBD3F87: ???

==25829== by 0x949A85: zend_activate_modules (zend_API.c:2285)

==25829== by 0x8B5EBC: php_request_startup (main.c:1491)

==25829== by 0xA84F7B: main (php_cli.c:1356)

...

如果设置ZEND_DONT_UNLOAD_MODULES,则会显示如下

$ valgrind --leak-check=full --show-reachable=yes php test.php

...

==25824== 8 bytes in 1 blocks are still reachable in loss record 2 of 30

==25824== at 0x4C25E84: calloc (in /usr/lib/valgrind/vgpreload_memcheck.so)

==25824== by 0xCE440DC: event_base_priority_init (in /usr/lib/libevent-1.4.so.2.1.3)

==25824== by 0xCE44316: event_base_new (in /usr/lib/libevent-1.4.so.2.1.3)

==25824== by 0xCE44368: event_init (in /usr/lib/libevent-1.4.so.2.1.3)

==25824== by 0xCBEE55F: zm_activate_http_request_pool (http_request_pool_api.c:58)

==25824== by 0xCBD3F87: zm_activate_http (http.c:373)

==25824== by 0x949A85: zend_activate_modules (zend_API.c:2285)

==25824== by 0x8B5EBC: php_request_startup (main.c:1491)

==25824== by 0xA84F7B: main (php_cli.c:1356)

...

使用CLI,web server内建或者CGI方式来执行php

为了使php CLI/CGI生成valgrind日志,你需要用以下命令来执行:

valgrind --tool=memcheck --num-callers=30 --log-file=php.log /path/to/php-cli script.php

这样会将log输出到当前目录下的php.log文件中。

如果要检测web server内建的php,需要对CLI可执行文件使用适当的-S和-t参数。然后通过浏览器请求来执行,再看php.log中的valgrind错误。

通过valgrind执行PHP Apache module

如果你是静态编译php和apache,那么需要确保apache的bin没有在make install之后被分离,否则会丢失所需的调试信息。检测如下,执行/path/to/httpd,这样会输出一些东西(例如not stripped)

$ file /usr/local/apache2/bin/httpd

/usr/local/apache2/bin/httpd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped

如果要针对apache的php mod来生成valgrind的检测报告,你需要在valgrind下运行apache:

valgrind --tool=memcheck --num-callers=30 --log-file=apache.log /usr/local/apache/bin/httpd -X

通过浏览器请求来访问,所有的内存错误都会输出到apache.log中。

http://www.bkjia.com/PHPjc/440136.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/440136.htmlTechArticle原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,编译php的时候,必须要带上 --enable-debug选项 。 2,禁用php的内存管理。 禁用Zend MM Z...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值