码头工人+ gdb调试PHP源码看strval函数C的实现方法

  介绍

码头工人+ 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的实现方法