記一次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分析代碼時判斷錯誤,造成了空指針調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM