使用 gdb 调试 PHP 扩展

php中文网
发布: 2016-06-20 12:56:12
原创
1601人浏览过
来自: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-debugmake && 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
登录后复制

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

立即学习PHP免费学习笔记(深入)”;

phpize ./configure --enable-debugmake && make install
登录后复制

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

白瓜面试
白瓜面试

白瓜面试 - AI面试助手,辅助笔试面试神器

白瓜面试 40
查看详情 白瓜面试
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;5960              if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
登录后复制

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

<?phpecho confirm_mydebug_compiled("hello world");
登录后复制

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

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

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号