使用 gdb 调试 PHP 扩展

10 篇文章 0 订阅

https://blog.csdn.net/carzyer/article/details/53339565

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

 
  1. ./configure --enable-debug

  2. make && make install

  3.  

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

 
  1. ./ext_skel --extname=mydebug

  2.  

当前目录下会自动生成mydebug目录,然后进入该目录,编辑config.m4文件,去掉10~12行的dnl,如下

 
  1. PHP_ARG_WITH(mydebug, for mydebug support,

  2. Make sure that the comment is aligned:

  3. [ --with-mydebug Include mydebug support])

在最后一行添加

 
  1. if test -z "$PHP_DEBUG"; then

  2. AC_ARG_ENABLE(debug,

  3. [--enable-debg compile with debugging system],

  4. [PHP_DEBUG=$enableval], [PHP_DEBUG=no]

  5. )

  6. fi

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

 
  1. phpize

  2. ./configure --enable-debug

  3. make && make install

  4.  

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

 
  1. PHP_FUNCTION(confirm_mydebug_compiled)

  2. {

  3. char *arg = NULL;

  4. int arg_len, len;

  5. char *strg;

  6.  
  7. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

  8. return;

  9. }

  10.  
  11. len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "mydebug", arg);

  12. RETURN_STRINGL(strg, len, 0);

  13. }

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

 
  1. 运行 nm mydebug.so

  2. 返回 zif_confirm_mydebug_compiled

  3. ……

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

 
  1. 第一步运行: gdb php

  2. 然后运行: break zif_confirm_mydebug_compiled

  3. 终端提示:Function "zif_confirm_mydebug_compiled" not defined.

  4. Make breakpoint pending on future shared library load? (y or [n])

  5. 输入: y

  6. 输入: run /tmp/test.php

  7. 此时会回显:Breakpoint 1, zif_confirm_mydebug_compiled (ht=1, return_value=0xb7bf0d44, return_value_ptr=0xb7bd6104, this_ptr=0x0, return_value_used=1)

  8. at /...../php-5.6.6/ext/mydebug/mydebug.c:56

  9. 然后输入: l

  10. 显示:

  11. 54 PHP_FUNCTION(confirm_mydebug_compiled)

  12. 55 {

  13. 56 char *arg = NULL;

  14. 57 int arg_len, len;

  15. 58 char *strg;

  16. 59

  17. 60 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

  18.  

其中文件/tmp/test.php的内容为:

 
  1. <?php

  2.  
  3. echo confirm_mydebug_compiled("hello world");

  4.  
  5.  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值