1. 程式人生 > >用Gdb+Nm除錯Php C Extension程式

用Gdb+Nm除錯Php C Extension程式

from:http://rdc.taobao.com/blog/cs/?p=1235

最近在寫Beanstalkd的php c extension客戶端程式,寫程式離不開除錯,下面把除錯中碰到的問題和解決方法和大家分享一下。

.so寫好了是給php指令碼呼叫的,如果php指令碼執行崩掉了,.so也只能在程序中飲恨而終,這時候php指令碼除錯經常用的echo, print_r, var_dump都派不上用場了。即使能列印一點兒錯誤log出來,但也是隻見表象,不知內情,根本解決不了一些詭異的bug。還好我們有gdb,下面就通過4步搞定php c extension的除錯。

1.準備可除錯的.so

在config.m4中加上下面的配置資訊

./configure –enable-debug //和除錯c程式的-g是一樣的效果

make //生成帶除錯資訊的.so

make install //安裝.so到php直譯器可以載入的路徑

2.通過nm檢視

要除錯就要設定斷點,要設定斷點就要知道符號,php擴充套件中為了保證函式不和c庫中的符號重複,在匯出函式前都加上統一字首zif,為了知道待除錯.so都有哪些符號,nm命令再合適不過了。nm命令用來列出目標檔案(.a或.so)的符號清單,包含函式或類名,如下圖:

3.載入php直譯器和.so到gdb

是時候載入php直譯器到gdb下了,這要用到gdb的file命令:file /usr/bin/php

這裡的php直譯器不需要有除錯符號,但要確保其載入了待除錯的.so(可以通過php –m 命令參考)。

4.break設定斷點,執行php指令碼進行除錯

都準備就緒了,設定斷點吧,用從nm檢視到的符號。設定好就run吧:run *.php這條命令是將.php指令碼作為引數傳遞給php直譯器,讓php直譯器執行*.php指令碼,並在斷點處停止。然後就list, print, next把bug都找出來吧。

設定斷點時一定要選擇y,因為斷點是設定在擴充套件so裡面,必須load之後才能才能找到。

其他的就和除錯c程式是一樣的步驟了。祝大家調的開心^_^