成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 gdb 調(diào)試 PHP 擴(kuò)展

golden_hamster / 3495人閱讀

摘要:來(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

這里的 phpizephp-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

相關(guān)文章

  • gdb調(diào)試PHP擴(kuò)展錯(cuò)誤

    摘要:有時(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編程的肯定...

    Aklman 評(píng)論0 收藏0
  • 關(guān)于PHP程序員解決問(wèn)題的能力

    摘要:但執(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)。如果解...

    lauren_liuling 評(píng)論0 收藏0
  • PHP 源碼 — implode 函數(shù)源碼分析

    摘要:本文首發(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...

    ?。?。 評(píng)論0 收藏0
  • 使用 gdb 調(diào)試 PHP core

    摘要:一開(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 ...

    Code4App 評(píng)論0 收藏0
  • php-stacktrace: PHP進(jìn)程外查看函數(shù)調(diào)用堆棧

    摘要:要看到具體的函數(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...

    xiyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<