原文: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<br />...<br />==25829== 8 bytes in 1 blocks are indirectly lost in loss record 2 of 21<br />==25829== at 0x4C25E84: ???<br />==25829== by 0xCE440DC: ???<br />==25829== by 0xCE44316: ???<br />==25829== by 0xCE44368: ???<br />==25829== by 0xCBEE55F: ???<br />==25829== by 0xCBD3F87: ???<br />==25829== by 0x949A85: zend_activate_modules (zend_API.c:2285)<br />==25829== by 0x8B5EBC: php_request_startup (main.c:1491)<br />==25829== by 0xA84F7B: main (php_cli.c:1356)<br />...
如果设置ZEND_DONT_UNLOAD_MODULES
,则会显示如下
$ valgrind --leak-check=full --show-reachable=yes php test.php<br />...<br />==25824== 8 bytes in 1 blocks are still reachable in loss record 2 of 30<br />==25824== at 0x4C25E84: calloc (in /usr/lib/valgrind/vgpreload_memcheck.so)<br />==25824== by 0xCE440DC: event_base_priority_init (in /usr/lib/libevent-1.4.so.2.1.3)<br />==25824== by 0xCE44316: event_base_new (in /usr/lib/libevent-1.4.so.2.1.3)<br />==25824== by 0xCE44368: event_init (in /usr/lib/libevent-1.4.so.2.1.3)<br />==25824== by 0xCBEE55F: zm_activate_http_request_pool (http_request_pool_api.c:58)<br />==25824== by 0xCBD3F87: zm_activate_http (http.c:373)<br />==25824== by 0x949A85: zend_activate_modules (zend_API.c:2285)<br />==25824== by 0x8B5EBC: php_request_startup (main.c:1491)<br />==25824== by 0xA84F7B: main (php_cli.c:1356)<br />...
使用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中。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

SublimeText3 Linux new version
SublimeText3 Linux latest version

SublimeText3 Mac version
God-level code editing software (SublimeText3)

SublimeText3 English version
Recommended: Win version, supports code prompts!

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.