用valgrind检测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<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

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

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

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
