.so寫好了是給php腳本調用的,若是php腳本執行崩掉了,.so也只能在進程中飲恨而終,這時候php腳本調試常常用的echo, print_r, var_dump都派不上用場了。即便能打印一點兒錯誤log出來,但也是隻見表象,不知內情,根本解決不了一些詭異的bug。還好咱們有gdb,下面就 經過4步搞定php c extension的調試。php
if test -z "$PHP_DEBUG"; then
AC_ARG_ENABLE(debug,
[
--enable-debug compile with debugging symbols
],[
PHP_DEBUG=$enableval
],[
PHP_DEBUG=no
])
fi函數
./configure –enable-debug --enable-yourmodule //和調試c程序的-g是同樣的效果debug
make //生成帶調試信息的.so調試
make install //安裝.so到php解釋器能夠加載的路徑進程
要調試就要設置斷點,要設置斷點就要知道符號,php擴展中爲了保證函數不和c庫中的符號重複,在導出函數前都加上統一前綴zif,爲了知道待調試.so都有哪些符號,nm命令再合適不過了。nm命令用來列出目標文件(.a或.so)的符號清單,包含函數或類名,以下圖:get
3.加載php解釋器和.so到gdbit
是時候加載php解釋器到gdb下了,這要用到gdb的file命令:file /usr/bin/php 這裏的php解釋器不須要有調試符號,但要確保其加載了待調試的.so(能夠經過php –m 命令參考)。io
(gdb) file ~/php/bin/php
class
4.break設置斷點,運行php腳本進行調試test
都準備就緒了,設置斷點吧,用從nm查看到的符號。設置好就run吧: run *.php 這條命令是將.php腳本做爲參數傳遞給php解釋器,讓php解釋器執行*.php腳本,並在斷點處中止。而後就list, print, next把bug都找出來吧。
其餘的就和調試c程序是同樣的步驟了。祝你們調的開心^_^