使用vscode调试PHP底层C源码
1|0使用vscode调试PHP底层C源码
一直想着有机会调试一下php底层代码来着,这周正好心血来潮,就跟着教程配置了一下。本篇文章是基于macOS,可能在编译php源码之前的步骤对使用windows的师傅没啥可参考的。
windows下比较麻烦,主要是在编译php源码这一步,最方便的办法是用docker来远程调试。具体可以参考这篇文章vscode远程调试php底层代码。使用p牛的dockerfile来自己建一个调试用docker。
说回mac下调试PHP源码需要的准备
1|1下载并编译PHP
使用git来下载源码,这样切换PHP版本会较为方便。(不过我现在应该不会这么做,因为下载下来的源码并不能直接编译成功,需要自己修改。改完的源码不舍得切换了)
当然,不排除个人环境的原因,通过checkout切换分支,重新编译一下还是很方便的,如果编译不出错的话。
如果是mac,编译PHP前需要安装一下最新版的bison,mac自带的版本太老。
编译需要调试的PHP。像我这里就开启了debug模式,开启了phar扩展,如果需要开启别的扩展,需要再./configure
命令后面自行指定。
编译完后,编译结果都在/source/php7.3.6/
文件夹下,/source/php7.3.6/bin/php
为可执行文件。
编译好的PHP,执行./php -v
会显示NTS DEBUG
。
1|2编译过程中的错误
在进行make编译的时候,碰到了两次报错。
第一个报错:
根据网上的教程,了解到这是php源码调用readdir_r函数的时候少传了一个参数。
查看php-src/main/reentrancy.c
函数定义:
int readdir_r(DIR *, struct dirent *, struct dirent **)
php调用:
readdir_r(dirp, entry)
readdir_r(dirp, entry)
修改为 readdir_r(dirp, entry,&entry)
即可编译通过
第二个报错:
报错内容较多,出现在Zend/zend_language_parser.lo位置。当时查找了好久的资料,都没有找到相关的内容。只知道implicit declaration of function 'yystrlen' is invalid in C99
这种报错类型是因为缺少相应的定义,由报错中的提示可以看出应该是缺少了yystpcpy这个函数。
访问文件php-src/Zend/zend_language_parser.c,可以看到这样一段代码
格式和yystpcpy
还有yystrlen
异常的统一,我当时就怀疑应该是在这个c文件中进行了函数重命名。
代码中出现yystpcpy
函数的位置一共有三处:
看样子应该就是stpcpy
函数没错了,试着在上面的#define处加入yystpcpy
与yystrlen
的定义:
依旧报错,这边是我没动脑子了,光想着和上面的define内容结构统一,但是strlen和stpcpy这两个函数前面其实是不需要zend前缀的。
修改之后重新编译,make成功。
1|3vscode调试
用vscode打开PHP源码,增加一个调试的配置:
选择环境c++(GDB/LLDB)-> Default Configuration,然后会生成一个配置文件:
参数详解:
- program 可执行的PHP文件的路径(编译生成的php文件)
- args 传给php的参数列表,像我上面所填写的执行的就是
php -f /Users/dre0m1/CTF/学习笔记/PHP源码/1.php
- cwd 当前目录,如果调试web应用,可以改成web根目录的路径
- stopAtEntry 是否在main函数的时候断下
之后就可以正常调试了。
__EOF__

本文链接:https://www.cnblogs.com/dre0m1/p/17050929.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库