zoukankan      html  css  js  c++  java
  • 记一次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 DemoModuls();  //该行会调用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 " 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分析代码时判断错误,造成了空指针调用。

  • 相关阅读:
    linux网卡混杂模式打开
    Python解释器运行成功,命令运行显示无此属性解决办法
    Python-01基础-09Python相关术语
    Python-01基础-05模块
    Python-01基础-04类
    Python-01基础-03函数
    Python-01基础-02数据类型
    Python-01基础-01Python简介
    Python-01基础-00菜鸟教程
    Module-Dask并行任务调度
  • 原文地址:https://www.cnblogs.com/dormscript/p/4787667.html
Copyright © 2011-2022 走看看