记一次PHP“Segmentation fault”调试经历
遇到的问题:
在linux上安装php5.5.26、phalcon2.0扩展、xhprof扩展,均正常安装,并可单独运行。但放在一起运行时出现“Segmentation fault”错误。
注:xhprof是从github上下载的最新版。
遇到问题时的上下文:
1: 新建项目,使用phalcon命令行工具
phalcon create-project store
2:修改入口文件,加入xhprof支持
3:web访问出现502,无任何php级别的错误日志
在终端下执行:php index.php 提示“段错误"
4:使用pecl上的xhprof版本,问题更多:自动加载类的问题。
5:逐行调试代码,找到报错处代码:
new \Demo\Moduls(); //该行会调用phalcon的自动加载类来引入文件
问题分析:
使用phalcon引入文件的方式与xhprof冲突。
各种测试及结果:
1:去除xhprof, 页面正常
(php5.5.26 + phalcon正常)
2:更换php版本为5.5.22,页面正常
(php5.5.22 + phalcon + xhprof 正常)
3:在php5.5.26上执行简单输出,加入xhprof,页面正常
(php5.5.26 + xhprof 正常)
小结:3者同时使用时存在问题。
解决问题步骤:
# ulimit -c unlimited
//开启core dump
# php index.php
//重新运行代码,输出:段错误 (core dumped),同时生成core dump文件
# gdb php -c core.[\d]+
//使用gdb调试coredump文件
# bt
//显示错误堆栈

//根据错误提示,定位问题在xhprof.c文件的第971行。查看xhporf.c文件,输出错误代码的上下文变量值
# p data->prev_execute_data->opline
//结果:value has been optimized out
//根据提示知道,变量值被编译器优化掉了。为了看到变量值,重新编译xhprof
//下载xhprof源代码
# cd xhprof-dir/extension
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# vim Makefile
//找到CFLAGS = -g -O2
//改为CFLAGS = -g -O0
# make && make install
//为了可以调试phalcon,顺便重新编译了phalcon
//下载phalcon源代码
# cd cphalcon/
//phalcon提供了一个install文件,可直接执行进行安装。现在为了修改编译参数,需要修改install文件,vim install
1:将phpize替换为 /usr/local/php/bin/phpize (一共两处)
2: 修改最后一行,删除中间部分的 “make && make install ”,添加"--with-php-config=/usr/local/php/bin/php-config"
如:/usr/local/php/bin/phpize && ./configure --enable-phalcon --with-php-config=/usr/local/php/bin/php-config && echo -e "\n Please run Make "
# ./install
# cd 64bits/
# vim Makefile
//搜索“CFLAGS=",改为“CFLAGS = -march=native -mtune=native -g -O0 -fomit-frame-pointer"
# make && make install
//此时,xhprof,phalcon都关闭了编译器优化,可以继续回到gdb调试
# php index.php
# gdb php -c core.[\d]+
# bt

//分析出错的的堆栈,发现从#0 - #4 ,一直在查找一个类文件,进入调试
# f 0
# p data->prev_execute_data->opline
//输出结果0x0,此时问题已经找到,程序在调用一个空指针。修改xhprof.c加一个空指针判断。一切功能正常!
问题原因分析:
在php5.5中,对引入文件方式进行了调整,xhporf中也做了相关的判断。但通过phalcon引入文件时,未使用新的方式,造成xhprof分析代码时判断错误,造成了空指针调用。
记一次PHP“Segmentation fault”调试经历的更多相关文章
- linux Ubuntu(Segmentation fault)段错误出现原因及调试方法
在linux下编译了一个程序,尝试运行的时候出现: Segmentation fault (core dumped) 初步确认为...完全不知道是什么玩意. 于是找度娘了. ----------- ...
- onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误
在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数.而且稍不注意就会出现segmentation fa ...
- 用GDB调试程序的设置 Segmentation fault(Core Dump)调试
在写wifi库的时候碰见一个 Segmentation fault(Core Dump) 所以需要用GDB调试下. 在cmake的时候,修改CMakeLists.txt set(CMAKE_C_FLA ...
- Segmentation fault(core dumped) 调试
ReadingList: https://mytechrants.wordpress.com/2009/05/22/debugging-a-segmentation-fault-using-gdb/ ...
- qt 单文档程序关闭时在delete ui处出现segmentation fault
做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...
- 论Segmentation fault
刚开始学c的时候,最头疼的事情是编译总是通不过,郁闷的要死,只要编译通过了,就兴奋的要死.现在,最头疼的事情是什么呢,编译没问题,但是程序跑的时候会出现Segmentation fault! 这个东西 ...
- Linux下的段错误(Segmentation fault)
Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用G ...
- Python调用C的SDK出现返回值不符合预期以及Segmentation fault
1.sdk返回值不是int型 1.1 登录函数调用 def login(ip, port, username, password, device_info, error_code):"&qu ...
- Segmentation Fault错误原因总结
最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路.从头开 ...
随机推荐
- (转)mysql中InnoDB表为什么要建议用自增列做主键
InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...
- Android--菜单详解
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单. 选项菜单: 一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种.最常用的是干版本创建 ...
- easyui datagrid 仿ext—右键
var createGridHeaderContextMenu = function(e, field) { e.preventDefault(); var grid = $(this);/* gri ...
- Hibernate的关联映射——单向1-1关联
Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...
- Linux 日常命令
命令 介绍说明 pwd 打印出当前所在目录 mkdir 创建一个目录 rmdir 删除一个目录 rm 删除文件或目录 -r:删除目录时必须加上 cp 复制一个文件或目录 -r:复制 ...
- 基于struts2、spring的应用闲置一段时间后报空指针错(转)
在做struts2.spring网站时,在系统闲置一段时间后,访问页面会出错,第二次再访问就正常了.后来查了后台日志,发现是数据库连接关闭了,导致页面访问出错.页面上报空指针错误,错误没有保留,日志中 ...
- 笔记本_thinkpad_e440
ZC: 这是我现在手上 公司工作的笔记本 1.进入 BIOS --> Enter键 2.背面信息 笔记本序列号(用于查找 驱动等) (ZC: 这个是 ThinkPad E440 的信息) 序号为 ...
- 软件测试--测试Demo
视频地址(第二课时):https://pan.baidu.com/s/1gfLVC2n 软件安装好了! 软件默认的浏览器是火狐. 如果需要IE,chrome,都在前一篇的安装包里有. 测试结果 视频里 ...
- Python中类的特殊方法详解
本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...
- iOS沙盒路径的查看和使用
1.模拟器沙盒目录 文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library. 因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文 ...