摘要:來(lái)自的擴(kuò)展使用開(kāi)發(fā),可以很容易的使用進(jìn)行調(diào)試。運(yùn)行返回實(shí)際就是在函數(shù)名前面添加,然后進(jìn)行調(diào)試第一步運(yùn)行然后運(yùn)行終端提示輸入輸入此時(shí)會(huì)回顯然后輸入顯示其中文件的內(nèi)容為可以看到,函數(shù)源代碼已經(jīng)出來(lái)了,可以使用常用的命令進(jìn)行調(diào)試了。
來(lái)自:http://www.codefrom.com/paper/%E4%BD%BF%E7%94%A8gdb%E8%B0%83%E8%AF%95p...
php的擴(kuò)展使用c/c++開(kāi)發(fā),可以很容易的使用gdb進(jìn)行調(diào)試。具體步驟如下:
首先編譯php的時(shí)候需要加上** --enable-debug**參數(shù)
./configure --enable-debug make && make install
在我的ubuntu機(jī)器上面測(cè)試,擴(kuò)展的目錄默認(rèn)為 /usr/local/lib/php/extensions/debug-non-zts-20131226/
這樣進(jìn)行php的源碼調(diào)試也很方便。
下一步進(jìn)行擴(kuò)展創(chuàng)建,進(jìn)入php源碼的ext目錄,運(yùn)行
./ext_skel --extname=mydebug
當(dāng)前目錄下會(huì)自動(dòng)生成mydebug目錄,然后進(jìn)入該目錄,編輯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
這樣就表示該擴(kuò)展能夠進(jìn)行調(diào)試了,然后編譯該擴(kuò)展,使用命令
phpize ./configure --enable-debug make && make install
這里的 phpize 和 php-config 需要事先配置好環(huán)境變量,然后加載該擴(kuò)展。在我的機(jī)器上面地址為 /usr/local/lib/php/extensions/debug-non-zts-20131226/。進(jìn)入mydebug擴(kuò)展源碼目錄,默認(rèn)生成的函數(shù)為 confirm_mydebug_compiled,定義在 mydebug.c,擴(kuò)展自動(dòng)生成的函數(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ù),然后拼成一句字符串返回。通過(guò)nm命令查看生成的mydebug.so導(dǎo)出的符號(hào)。
運(yùn)行 nm mydebug.so 返回 zif_confirm_mydebug_compiled ……
PHP_FUNCTION 實(shí)際就是在函數(shù)名前面添加 zif_,然后進(jìn)行g(shù)db調(diào)試
第一步運(yùn)行: gdb php 然后運(yùn)行: 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 此時(shí)會(huì)回顯: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)出來(lái)了,可以使用常用的gdb命令進(jìn)行調(diào)試了。
更多精彩原創(chuàng)內(nèi)容進(jìn)入http://www.codefrom.com/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30249.html
摘要:有時(shí)候,使用的第三方擴(kuò)展之后,可能會(huì)發(fā)生一些錯(cuò)誤,這個(gè)時(shí)候,可能就需要更底層的方式追蹤調(diào)試程序發(fā)生錯(cuò)誤的地方和原因,熟悉下編程的肯定不陌生首先,使用命令,查看系統(tǒng)是否會(huì)生成文件返回結(jié)果可能是當(dāng)返回結(jié)果為時(shí),說(shuō)明系統(tǒng)不會(huì)生成文件,這個(gè)時(shí)候 有時(shí)候,使用PHP的第三方擴(kuò)展之后,可能會(huì)發(fā)生一些錯(cuò)誤,這個(gè)時(shí)候,可能就需要更底層的方式追蹤調(diào)試程序發(fā)生錯(cuò)誤的地方和原因,熟悉linux下C編程的肯定...
摘要:但執(zhí)行后沒(méi)有任何信息輸出,這時(shí)候通過(guò)什么方法能知道程序錯(cuò)在哪里這里可以將解決問(wèn)題能力分為個(gè)等級(jí),越到后面的表示能力越強(qiáng)。這個(gè)考驗(yàn)全部通過(guò),表明此程序員已經(jīng)具備了專業(yè)程序員應(yīng)該有的解決問(wèn)題能力了。 這個(gè)話題老生長(zhǎng)談了,在面試中必然考核的能力中,我個(gè)人認(rèn)為解決問(wèn)題能力是排第一位的,比學(xué)習(xí)能力優(yōu)先級(jí)更高。解決問(wèn)題的能力既能看出程序員的思維能力,應(yīng)變能力,探索能力等,又可以看出他的經(jīng)驗(yàn)。如果解...
摘要:本文首發(fā)于作者基于中的在中,的作用是將一個(gè)一維數(shù)組的值轉(zhuǎn)化為字符串。為了能通過(guò)修改代碼來(lái)看效果,將函數(shù)復(fù)制到擴(kuò)展文件中,并將其命名為源碼內(nèi)容省略在擴(kuò)展中新增一個(gè)擴(kuò)展函數(shù)因?yàn)閿U(kuò)展的編譯以及引入前面的已經(jīng)提及。 本文首發(fā)于 https://github.com/suhanyujie...* 作者:suhanyujie 基于 PHP 7.3.3 PHP 中的 implode 在 PH...
摘要:一開(kāi)啟查看是否開(kāi)啟輸出打開(kāi)文件記錄關(guān)閉文件記錄設(shè)置內(nèi)核出來(lái)的存放路徑注意目錄要有權(quán)限給寫(xiě)二調(diào)試準(zhǔn)備文件獲取地址保存在服務(wù)器上,例如備用。 一、開(kāi)啟 查看是否開(kāi)啟 core dump 輸出 ulimit -a 打開(kāi) core dump 文件記錄 ulimit -c unlimited yum install gdb php-dbg 關(guān)閉 core dump 文件記錄 ulimit -c ...
摘要:要看到具體的函數(shù)就需要用擴(kuò)展或者用調(diào)試,高級(jí)點(diǎn)還可以用。就是要跟蹤的進(jìn)程。原理眾所周知,是用寫(xiě)的,而各種函數(shù)調(diào)用的信息都會(huì)用語(yǔ)言的來(lái)表示,所以只要兩步就能拿到堆棧信息讀取進(jìn)程的內(nèi)存在內(nèi)存里找到函數(shù)調(diào)用堆棧信息第一步可以通過(guò)或?qū)崿F(xiàn)。 生產(chǎn)環(huán)境多多少少會(huì)遇到CPU占用很高或者卡住的PHP進(jìn)程,這時(shí)怎樣才能知道這個(gè)進(jìn)程在干啥呢? 一個(gè)方法是strace跟蹤系統(tǒng)調(diào)用和參數(shù),這樣能大概知道PHP...
閱讀 1873·2023-04-25 14:28
閱讀 1906·2021-11-19 09:40
閱讀 2810·2021-11-17 09:33
閱讀 1395·2021-11-02 14:48
閱讀 1726·2019-08-29 16:36
閱讀 3345·2019-08-29 16:09
閱讀 2928·2019-08-29 14:17
閱讀 2391·2019-08-29 14:07