摘要:來自的擴展使用開發(fā),可以很容易的使用進行調(diào)試。運行返回實際就是在函數(shù)名前面添加,然后進行調(diào)試第一步運行然后運行終端提示輸入輸入此時會回顯然后輸入顯示其中文件的內(nèi)容為可以看到,函數(shù)源代碼已經(jīng)出來了,可以使用常用的命令進行調(diào)試了。
來自:http://www.codefrom.com/paper/%E4%BD%BF%E7%94%A8gdb%E8%B0%83%E8%AF%95p...
php的擴展使用c/c++開發(fā),可以很容易的使用gdb進行調(diào)試。具體步驟如下:
首先編譯php的時候需要加上** --enable-debug**參數(shù)
./configure --enable-debug make && make install
在我的ubuntu機器上面測試,擴展的目錄默認(rèn)為 /usr/local/lib/php/extensions/debug-non-zts-20131226/
這樣進行php的源碼調(diào)試也很方便。
下一步進行擴展創(chuàng)建,進入php源碼的ext目錄,運行
./ext_skel --extname=mydebug
當(dāng)前目錄下會自動生成mydebug目錄,然后進入該目錄,編輯config.m4文件,去掉10~12行的dnl,如下
PHP_ARG_WITH(mydebug, for mydebug support, Make sure that the comment is aligned: [ --with-mydebug Include mydebug support])
在最后一行添加
if test -z "$PHP_DEBUG"; then AC_ARG_ENABLE(debug, [--enable-debg compile with debugging system], [PHP_DEBUG=$enableval], [PHP_DEBUG=no] ) fi
這樣就表示該擴展能夠進行調(diào)試了,然后編譯該擴展,使用命令
phpize ./configure --enable-debug make && make install
這里的 phpize 和 php-config 需要事先配置好環(huán)境變量,然后加載該擴展。在我的機器上面地址為 /usr/local/lib/php/extensions/debug-non-zts-20131226/。進入mydebug擴展源碼目錄,默認(rèn)生成的函數(shù)為 confirm_mydebug_compiled,定義在 mydebug.c,擴展自動生成的函數(shù)。
PHP_FUNCTION(confirm_mydebug_compiled) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "mydebug", arg); RETURN_STRINGL(strg, len, 0); }
大概意思就是獲取字符串參數(shù),然后拼成一句字符串返回。通過nm命令查看生成的mydebug.so導(dǎo)出的符號。
運行 nm mydebug.so 返回 zif_confirm_mydebug_compiled ……
PHP_FUNCTION 實際就是在函數(shù)名前面添加 zif_,然后進行g(shù)db調(diào)試
第一步運行: gdb php 然后運行: break zif_confirm_mydebug_compiled 終端提示:Function "zif_confirm_mydebug_compiled" not defined. Make breakpoint pending on future shared library load? (y or [n]) 輸入: y 輸入: run /tmp/test.php 此時會回顯:Breakpoint 1, zif_confirm_mydebug_compiled (ht=1, return_value=0xb7bf0d44, return_value_ptr=0xb7bd6104, this_ptr=0x0, return_value_used=1) at /...../php-5.6.6/ext/mydebug/mydebug.c:56 然后輸入: l 顯示: 54 PHP_FUNCTION(confirm_mydebug_compiled) 55 { 56 char *arg = NULL; 57 int arg_len, len; 58 char *strg; 59 60 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
其中文件/tmp/test.php的內(nèi)容為:
可以看到,函數(shù)源代碼已經(jīng)出來了,可以使用常用的gdb命令進行調(diào)試了。
更多精彩原創(chuàng)內(nèi)容進入http://www.codefrom.com/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30249.html
摘要:有時候,使用的第三方擴展之后,可能會發(fā)生一些錯誤,這個時候,可能就需要更底層的方式追蹤調(diào)試程序發(fā)生錯誤的地方和原因,熟悉下編程的肯定不陌生首先,使用命令,查看系統(tǒng)是否會生成文件返回結(jié)果可能是當(dāng)返回結(jié)果為時,說明系統(tǒng)不會生成文件,這個時候 有時候,使用PHP的第三方擴展之后,可能會發(fā)生一些錯誤,這個時候,可能就需要更底層的方式追蹤調(diào)試程序發(fā)生錯誤的地方和原因,熟悉linux下C編程的肯定...
摘要:但執(zhí)行后沒有任何信息輸出,這時候通過什么方法能知道程序錯在哪里這里可以將解決問題能力分為個等級,越到后面的表示能力越強。這個考驗全部通過,表明此程序員已經(jīng)具備了專業(yè)程序員應(yīng)該有的解決問題能力了。 這個話題老生長談了,在面試中必然考核的能力中,我個人認(rèn)為解決問題能力是排第一位的,比學(xué)習(xí)能力優(yōu)先級更高。解決問題的能力既能看出程序員的思維能力,應(yīng)變能力,探索能力等,又可以看出他的經(jīng)驗。如果解...
摘要:本文首發(fā)于作者基于中的在中,的作用是將一個一維數(shù)組的值轉(zhuǎn)化為字符串。為了能通過修改代碼來看效果,將函數(shù)復(fù)制到擴展文件中,并將其命名為源碼內(nèi)容省略在擴展中新增一個擴展函數(shù)因為擴展的編譯以及引入前面的已經(jīng)提及。 本文首發(fā)于 https://github.com/suhanyujie...* 作者:suhanyujie 基于 PHP 7.3.3 PHP 中的 implode 在 PH...
摘要:一開啟查看是否開啟輸出打開文件記錄關(guān)閉文件記錄設(shè)置內(nèi)核出來的存放路徑注意目錄要有權(quán)限給寫二調(diào)試準(zhǔn)備文件獲取地址保存在服務(wù)器上,例如備用。 一、開啟 查看是否開啟 core dump 輸出 ulimit -a 打開 core dump 文件記錄 ulimit -c unlimited yum install gdb php-dbg 關(guān)閉 core dump 文件記錄 ulimit -c ...
摘要:要看到具體的函數(shù)就需要用擴展或者用調(diào)試,高級點還可以用。就是要跟蹤的進程。原理眾所周知,是用寫的,而各種函數(shù)調(diào)用的信息都會用語言的來表示,所以只要兩步就能拿到堆棧信息讀取進程的內(nèi)存在內(nèi)存里找到函數(shù)調(diào)用堆棧信息第一步可以通過或?qū)崿F(xiàn)。 生產(chǎn)環(huán)境多多少少會遇到CPU占用很高或者卡住的PHP進程,這時怎樣才能知道這個進程在干啥呢? 一個方法是strace跟蹤系統(tǒng)調(diào)用和參數(shù),這樣能大概知道PHP...
閱讀 1856·2023-04-25 14:28
閱讀 1892·2021-11-19 09:40
閱讀 2795·2021-11-17 09:33
閱讀 1385·2021-11-02 14:48
閱讀 1710·2019-08-29 16:36
閱讀 3333·2019-08-29 16:09
閱讀 2917·2019-08-29 14:17
閱讀 2378·2019-08-29 14:07