介绍
码头工人+ gdb调试PHP源码看strval函数C的实现方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
PHP strval函数的作用很简单,就是你给他一个值,他给你返回字符串类型。
算是一个比较简单的函数了,我们来通过gdb来一探究竟。
通过本文,你可以窥探下
●gdb的简单使用
●gdb gui模式初探
●看看平时写的PHP代码在C语言里的样子
●对使用gdb调试PHP代码有个初步了解
●对了,文末有一些截的图,不要错过
<>强采购食材强>
●电脑一台
●码头工人和docker-compose
gdb也好,PHP也好,都打包成码头工人镜像啦,开袋即食,甚好。
<强>备菜环节强>
<强> 1,使用码头工人拉取环境强>
#拉取准备好的环境 git克隆https://github.com/rovast/docker-examples.git #进入项目 cd docker-examples/gdb-php-src/#启动,会经历一个漫长又不太漫长的等待,看你网速 docker-compose起来- d
关于容器内的环境,大家可以看看dockerfile
其实很简单,就是基于gcc官方镜像构建,然后增加了vim gdb,并且下载了php7.0.0的源码,按照调试参数进行编译
显示如下
创建网络“gdb-php-src_default"使用默认驱动程序 创建gdb-php-src……
2,进入容器
码头工人exec - gdb-php-src bash # # #显示下面的东西,表示你已经进入到容器内了# # # # root@71a98d1bc1a6:/home #
我们看看容器内的环境(php以及gdb)
# # #我们在容器内看看环境 root@71a98d1bc1a6: # ls/回家 php-7.0.0 start.md root@71a98d1bc1a6:/home # gdb - v GNU gdb (Debian 7.12 6) 7.12.0.20161007-git 版权(C) 2016自由软件基金会,公司。 许可证GPLv3 +: GNU GPL 3或更高版本& lt; http://gnu.org/licenses/gpl.html> 这是自由软件:你可以自由变化和重新分配。 没有保修,法律允许的程度。类型“显示copying" 和“显示warranty"获取详细信息。 GDB是配置为“x86_64-linux-gnu"。 类型“显示configuration"配置细节。 bug报告说明,请参阅: & lt; http://www.gnu.org/software/gdb/bugs/>。 找到GDB手册和其他文档资源> root@71a98d1bc1a6:/home # vi测试。php
输入以下内容
& lt; php ? strval (1234),
这个文件干的事情就比较简单了,就是把-1234(整形]转换为-1234(字符串)
<强> 2,开始调试,进入gdb 强>
接下来车速较快,各位按步骤跟上
输入gdb php,开始调试
root@71a98d1bc1a6: php/home # gdb GNU gdb (Debian 7.12 6) 7.12.0.20161007-git 版权(C) 2016自由软件基金会,公司。 许可证GPLv3 +: GNU GPL 3或更高版本& lt; http://gnu.org/licenses/gpl.html> 这是自由软件:你可以自由变化和重新分配。 没有保修,法律允许的程度。类型“显示copying" 和“显示warranty"获取详细信息。 GDB是配置为“x86_64-linux-gnu"。 类型“显示configuration"配置细节。 bug报告说明,请参阅: & lt; http://www.gnu.org/software/gdb/bugs/>。 找到GDB手册和其他文档资源> b zend_long_to_str (GDB)/home/php-7.0.0/Zend/zend_operators断点1 0 x810423:文件。c, 2743行。 (gdb) b zend_print_ulong_to_buf 断点2 0 x5f387b: zend_print_ulong_to_buf。(13个位置) (gdb)
这里在关键函数zend_long_to_str和zend_print_ulong_to_buf打了断点。
b在gdb中是断点缩写,后面可以加函数名,或者当前文件的行号都是可以的
<强> 4,执行,查看断点值强>
(gdb) r测试。php #执行我们刚才的那个php文件 开始计划:/usr/local/bin/php test.php (使用libthread_db启用线程调试) 使用主机libthread_db图书馆“/lib/x86_64-linux-gnu/libthread_db.so.1"。 警告:文件“/usr/地方/lib64/libstdc + + .so.6.0.25-gdb.py"交通量被你拒绝的交通量safe-path& # 39;设置为“$ debugdir: datadir/auto-load"美元。 使执行此文件的添加 add-auto-load-safe-path/usr/local/lib64/libstdc + + .so.6.0.25-gdb.py 行到您的配置文件“/根/.gdbinit"。 完全禁用这个添加安全保护 设置自动负载安全轨道/行到您的配置文件“/根/.gdbinit"。 看到更多的信息关于这个安全保护 “自动负载安全path"在GDB手册。例如,从shell运行: 信息“(gdb)自动负载安全path" 断点,zend_long_to_str/home/php-7.0.0/Zend/zend_operators.c (num=-1234): 2743 2743 char * res=zend_print_long_to_buf (buf + sizeof (buf) - 1, num); (gdb)码头工人+ gdb调试PHP源码看strval函数C的实现方法