遇到的問題:
在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分析代碼時判斷錯誤,造成了空指針調用。
