用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
...
==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中。
用valgrind检测php扩展内存泄露的更多相关文章
- vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较,Valgrind Cheatsheet
概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...
- 使用Xcode7的Instruments检测解决iOS内存泄露
文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- (转载--修改)使用Xcode9的Instruments检测解决iOS内存泄露
作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我 ...
- 移植Valgrind检测Android JNI内存泄漏
1.相关工具 Valgrind:从Valgrind官网下载最新的源码包,我这里用的是:valgrind 3.14.0 (tar.bz2) [17MB] - 9 October 2018. Ubuntu ...
- Qt应用中检测内存泄露——VLD
本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...
- Android内存泄露---检测工具篇
内存使用是程序开发无法回避的一个问题.如果我们毫不在意肆意使用,总有一天会为此还账,且痛不欲生...所以应当防患于未然,把内存使用细化到平时的每一行代码中. 内存使用概念较大,本篇先讲对已有app如何 ...
- Android内存泄露
Android 内存泄漏是一个十分头疼的事情.LeakCanary是一款开源软件,主要作用是检测 Android APP 内存泄露.比起以前的 MAT 工具,LeakCanary 有着十分强大的功能, ...
- VS2008中捕获内存泄露(转)
内存泄露十分讨厌,捕获内存泄露更加令人厌烦…… 其实,VS本身就有内存泄露的检测机制.只需做以下操作即可开启.(同时必须在debug模式 下运行程序并且以 正常流程退出 ) // 在入口函数cpp中添 ...
随机推荐
- 动画性能优化-requestAnimationFrame、GPU等
最近在做一个场景动画,有一个欢迎界面和一个主动画界面,两个界面之间的连接通过一个进度条来完成,当进度条完成,提供通往主动画的按钮. 画面会从一个个的场景移动过去,用户可通过点击抽奖.查看气泡商铺等进行 ...
- 747_Largest-Number-At-Least-Twice-of-Others
目录 747_Largest-Number-At-Least-Twice-of-Others Description Solution Java solution Python solution 74 ...
- mysql 登录报错:ERROR 1045 (28000)
公司linux系统的mysql数据库root用户设置过密码,但常常用命令'mysql -u root -p'登录报错,有时又能登录.登录报错信息为: [root@localhost ~]# mysql ...
- centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
Part1:CentOS文件/文件夹操作 1.新建文件夹 即创建目录 mkdir 文件名 新建一个名为test的文件夹在home下 vi source1 mkdir /home/test 注意:当创建 ...
- 令人头疼的Connection Reset
背景: 要爬取某网站的数据,数据每页10条,有很多页(形式如同table表格).使用HttpClient 逐行逐页爬取数据,但在循环爬取多次时,总会在不确定的位置报错 在检查代码逻辑无果之后,开始疯狂 ...
- java 并发(七)--- ThreadLocal
文章部分图片来自参考资料 问题 : ThreadLocal 底层原理 ThreadLocal 需要注意什么问题,造成问题的原因是什么,防护措施是什么 ThreadLocal 概述 Threa ...
- Java包装类、拆箱和装箱详解
转载:https://www.cnblogs.com/ok932343846/p/6749488.html 虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程, ...
- Linux之Ubuntu基本命令提炼,分条列出
Ubuntu系统的root用户有时没有安装,我们可以先输入一个root,他会有一个提示命令,然后我们输入该命令,进行安装,安装完后,使用sudopasswd 命令设置密码,设置完后的密码就是root用 ...
- vi 多行注释和取消注释
注释 :1,10 s/^/#/ 注释1到10行 取消注释 ctl+v 进入visual block模式 选中 #号 按d 或x 将其删除
- Eclipse3.2查找jre的问题
前几天遇到一个问题,最开始电脑上使用的是解压的JDK(带jre),但是不能打开jar文件.所以从网上下载了一个jre1.8,然后问题来了,Eclipse打开就报错,弹出一个框,在eclipse的目录下 ...