资讯专栏INFORMATION COLUMN

使用 gdb 调试 PHP 扩展

golden_hamster / 3323人阅读

摘要:来自的扩展使用开发,可以很容易的使用进行调试。运行返回实际就是在函数名前面添加,然后进行调试第一步运行然后运行终端提示输入输入此时会回显然后输入显示其中文件的内容为可以看到,函数源代码已经出来了,可以使用常用的命令进行调试了。

  

来自: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 --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的内容为:



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

  

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30249.html

相关文章

  • gdb调试PHP扩展错误

    摘要:有时候,使用的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉下编程的肯定不陌生首先,使用命令,查看系统是否会生成文件返回结果可能是当返回结果为时,说明系统不会生成文件,这个时候 有时候,使用PHP的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉linux下C编程的肯定...

    Aklman 评论0 收藏0
  • 关于PHP程序员解决问题的能力

    摘要:但执行后没有任何信息输出,这时候通过什么方法能知道程序错在哪里这里可以将解决问题能力分为个等级,越到后面的表示能力越强。这个考验全部通过,表明此程序员已经具备了专业程序员应该有的解决问题能力了。 这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高。解决问题的能力既能看出程序员的思维能力,应变能力,探索能力等,又可以看出他的经验。如果解...

    lauren_liuling 评论0 收藏0
  • PHP 源码 — implode 函数源码分析

    摘要:本文首发于作者基于中的在中,的作用是将一个一维数组的值转化为字符串。为了能通过修改代码来看效果,将函数复制到扩展文件中,并将其命名为源码内容省略在扩展中新增一个扩展函数因为扩展的编译以及引入前面的已经提及。 本文首发于 https://github.com/suhanyujie...* 作者:suhanyujie 基于 PHP 7.3.3 PHP 中的 implode 在 PH...

    琛h。 评论0 收藏0
  • 使用 gdb 调试 PHP core

    摘要:一开启查看是否开启输出打开文件记录关闭文件记录设置内核出来的存放路径注意目录要有权限给写二调试准备文件获取地址保存在服务器上,例如备用。 一、开启 查看是否开启 core dump 输出 ulimit -a 打开 core dump 文件记录 ulimit -c unlimited yum install gdb php-dbg 关闭 core dump 文件记录 ulimit -c ...

    Code4App 评论0 收藏0
  • php-stacktrace: PHP进程外查看函数调用堆栈

    摘要:要看到具体的函数就需要用扩展或者用调试,高级点还可以用。就是要跟踪的进程。原理众所周知,是用写的,而各种函数调用的信息都会用语言的来表示,所以只要两步就能拿到堆栈信息读取进程的内存在内存里找到函数调用堆栈信息第一步可以通过或实现。 生产环境多多少少会遇到CPU占用很高或者卡住的PHP进程,这时怎样才能知道这个进程在干啥呢? 一个方法是strace跟踪系统调用和参数,这样能大概知道PHP...

    xiyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<