使用 gdb 调试 PHP 扩展

发布时间:2019-08-07 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了使用 gdb 调试 PHP 扩展脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

来自:http://www.codefrom.com/paper/%E4%BD%BF%E7%94%A8gdb%E8%B0%83%E8%AF%95p...

php的扩展使用c/c++开发,可以很容易的使用GDB进行调试。具体步骤如下:
首先编译php的时候需要加上** --enable-debug**参数

./configure @H_406_18@--enable-debug
make && make install

在我的ubuntu机器上面测试,扩展的目录默认为 /usr/local/lib/php/extensions/debug-non-zts-20131226/
这样进行php的码调试也很方便。
下一步进行扩展创建,进入php源码的ext目录,运行

./ext_skel --extname=mydebug  

当前目录下会自动生成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

这样就表示该扩展能够进行调试了,然后编译该扩展,使用命令

phpize 
./configure --enable-debug
make && make install

这里的 phpizephp-config 需要事先配置好环境变量,然后加载该扩展。在我的机器上面地址为 /usr/local/lib/php/extensions/debug-non-zts-20131226/。进入mydebug扩展源码目录,默认生成的函数为 confirm_mydebug_compiled,定义在 mydebug.c,扩展自动生成的函数。

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);
}

大概意思就是获取字符串参数,然后拼成一句字符串返回。通过nm命令查看生成的mydebug.so导出的符号。

运行 nm mydebug.so
返回 zif_confirm_mydebug_compiled
    ……

PHP_FUNCTION 实际就是在函数名前面添加 zif_,然后进行gdb调试

第一步运行: 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的内容为:

<?php

echo confirm_mydebug_compiled("hello world");

可以看到,函数源代码已经出来了,可以使用常用的gdb命令进行调试了。

更多精彩原创内容进入http://www.codefrom.com/

脚本宝典总结

以上是脚本宝典为你收集整理的使用 gdb 调试 PHP 扩展全部内容,希望文章能够帮你解决使用 gdb 调试 PHP 扩展所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。