用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中添 ...
随机推荐
- angular2自学笔记(二)---路由、服务等八大主要构造块
angular的思想:总是把数据访问工作委托给一个支持性服务类. Angular 应用的:用 Angular 扩展语法编写 HTML 模板, 用组件类管理这些模板,用服务添加应用逻辑, 用模块打包发布 ...
- OpenTLD在VS2012和opencv246编译通过
最近看到了TLD的跟踪视频,觉得很有意思,刚好最近在看行人检测所以就打算下载源码玩一玩,因为源码是Linux版本的(原作者写的是C++和MATLAB的混合编程)C++源码可以在我的博客TLD(一种目标 ...
- jQuery全屏滚动插件fullPage.js中文帮助文档API
jQuery全屏滚动插件fullPage.js中文帮助文档API 发现了一个fullPage.js插件,于是百度了一下,还就是这个插件的作用,其实有很多网站都做了全屏滚动的特效,效果也很好看,今天 ...
- unity GUI Layout 组件(全)
[expand 扩张][fitter 装配工] [envelope 信封,包装] Layout 布局 三种. Horizontal Layout Group 水平布局 Padding:内边距,单位 ...
- jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)
如果你看了上一篇<ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)>的话,应该就知道我是逼不得已要认真学 ...
- 一、window下zookeeper独立部署
zookeeper是一个分布式协调应用,用于管理大型主机.通俗地说,分布式应用相对于单体应用存在着很多要处理的问题,而这些问题通常是不太好处理的.比如,典型的一致性问题,而zookeeper可以很简单 ...
- 4、构造方法、this、super
构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...
- poj 1088(DP+递归)
这题状态方程很容易得到:DP[i][j] = max(DP[i-1][j],DP[i+1][j],DP[i][j-1],DP[i][j+1]) + 1 难点在于边界条件和剪枝,因为这方程的条件是点在m ...
- Struts2(一)— 入门
一.概述 1.什么是Struts2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立 ...
- 插件式WebApi服务及自动生成Api帮助文档
上一篇博客中,讲到了将WebApi Host到控制台和IIS,本篇总结一下如何将WebApi的Service以插件的形式进行动态部署,并设置Hoster的首页显示Api帮助文档,当然,也包括动态部署进 ...