php7擴展開發[6] 調試Segmentation fault

http://www.tuicool.com/articles/ZNzAfu3


糾錯 06 Feb 2016

1.編譯安裝php-7.0.5,編譯時,加上--enable-debug --enable-phpdbg

wget http://cn2.php.net/distributions/php-7.0.5.tar.gz
tar zxvf php-7.0.5.tar.gz
cd php-7.0.5
./configure --prefix=/usr/local/php7.0.5 --enable-debug --enable-cli --enable-fpm   --enable-pcntl --with-openssl --enable-mysqlnd  --enable-phpdbg --enable-embed
make && make install


2.php7擴展調用時,出現Segmentation fault

2.1
ulimit -c unlimited
再執行一次php腳本,出現 core.xxxx,OK就先到這裏
gdb php -c core.xxxx

2.2
修改擴展模塊中的config.m4
在其中加入:
if test -z "$PHP_DEBUG" ; then
    AC_ARG_ENABLE(debug, [--enable-debug compile with debugging system], [PHP_DEBUG=$enableval],[PHP_DEBUG=no] )
fi


2.3 重新編譯擴展源碼
phpize
./configure --with-php-config=/usr/bin/php-config --enable-debug
make && make install

2.4 確認斷點函數
nm modules/xxx.so 會列出所有的函數
如果自己寫的一個Demo類中的get方法出現問題 一般這個函數名爲zim_demo_get
或者nm modules/xxx.so|grep xxx 找出你自己的寫的方法名

3.調試xxxx.php文件
gdb php 進入gdb界面
break zim_demo_get 會問y/n 選y
gdb -q xxxx.php -c /etc/php.ini

這時會停在zend_method(demo,get){}方法內,這時只要輸入n回車  輸入n回車  輸入n回車
直到出現Segmentation基本上可以定位問題所在。當然你也可以在每一步print 打印你想看的變量內容。

  • 請尊重本人勞動成功,可以隨意轉載但保留以下信息
  • 作者:歲月經年
  • 時間:2016年03月

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章