遇到的问题:

在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”调试经历的更多相关文章

  1. linux Ubuntu(Segmentation fault)段错误出现原因及调试方法

      在linux下编译了一个程序,尝试运行的时候出现: Segmentation fault (core dumped) 初步确认为...完全不知道是什么玩意. 于是找度娘了. ----------- ...

  2. onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误

    在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数.而且稍不注意就会出现segmentation fa ...

  3. 用GDB调试程序的设置 Segmentation fault(Core Dump)调试

    在写wifi库的时候碰见一个 Segmentation fault(Core Dump) 所以需要用GDB调试下. 在cmake的时候,修改CMakeLists.txt set(CMAKE_C_FLA ...

  4. Segmentation fault(core dumped) 调试

    ReadingList: https://mytechrants.wordpress.com/2009/05/22/debugging-a-segmentation-fault-using-gdb/ ...

  5. qt 单文档程序关闭时在delete ui处出现segmentation fault

    做了个显示图片的单文档程序. qt 单文档程序关闭时在delete ui处出现segmentation fault. 调试发现调用两次mainwindow析构函数. http://blog.csdn. ...

  6. 论Segmentation fault

    刚开始学c的时候,最头疼的事情是编译总是通不过,郁闷的要死,只要编译通过了,就兴奋的要死.现在,最头疼的事情是什么呢,编译没问题,但是程序跑的时候会出现Segmentation fault! 这个东西 ...

  7. Linux下的段错误(Segmentation fault)

    Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用G ...

  8. Python调用C的SDK出现返回值不符合预期以及Segmentation fault

    1.sdk返回值不是int型 1.1 登录函数调用 def login(ip, port, username, password, device_info, error_code):"&qu ...

  9. Segmentation Fault错误原因总结

    最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路.从头开 ...

随机推荐

  1. C++库汇总

    C++库汇总 C++类库介绍再次体现了C++保持核心语言的效率同时大力发展应用库的发展趋势!!在C++中,库的地位是非常高的.C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功 ...

  2. Java开发中经典的小实例-(随机产生验证码)

    import java.util.Scanner;public class Test10 {    public static void main(String[] args) {        // ...

  3. Key Figure中的Aggregation决定了DSO/CUBE转换规则中的Aggregation合计方式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Java面向对象三大特点之继承

    概念: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类 ...

  5. Windows2012安装IIS和FTP

    Windows2012安装IIS和FTP  1.打开Windows 2012的服务器管理器,选择 管理→添加角色和功能  2.进入 添加角色和功能向导,选择 “Web服务器(IIS)” 3.根据情况选 ...

  6. php短路与 短路或

    关于php短路的问题特性,三种写法的区别 $a = 1;$b=0;第一种: $a && $b = 'cccccccc';第二种 $a || $b = 'cccccccc';第三种 if ...

  7. APP成功上线前的bug解决方案

    首先测试用例设计阶段,设计并维护一个各个功能入口的说明文档.其实这个文档的作用很大,一方面对于bug回归阶段的人来说,这是用于提醒的;另外一个方面,在随机测试的时候,随机程度也能有所提高,测试人员能够 ...

  8. python爬虫(1)

    了解python的基本语法后就可以开始了,边学边巩固. 学爬虫那什么是网络爬虫,以下是百度百科的定义:网络爬虫(又被称为网页蜘蛛,网络机器人, 在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...

  9. 你真的会写单例模式吗-------Java实现

    转载: 你真的会写单例模式吗--Java实现 单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好.用对单例模式,还真得费一番脑筋.本文对Java中常见的单例模式写法做了一个总结,如有错漏 ...

  10. TestLink

    TestLink的主要功能包括: 测试需求管理 测试用例管理 测试用例对测试需求的覆盖管理 测试计划的制定 测试用例的执行 大量测试数据的度量和统计功能 TestLink的主要特色包括: 支持多产品或 ...