PHP源码解析_mac源码编译PHP7.1 VSCode 断点调试配置

不管出于什么目的,做PHP的想往精深走是绕不开读读源码这条路的。这篇文字记录了本地源码编译PHP7.1到配置VSCode的debug调试的过程。现在2018年11月25日01:54:13,刚快写好的笔记因为一个错误操作丢失掉了,真的很MMP,以后要加个定时记录的功能了,哎。

编译安装PHP

mac 下编译PHP7会遇见几个问题点,autoconf未安装,bison版本问题。

获取

在PHP官网上直接下载下载包或者,去GitHub选择你中意的分支clone,这边我们选择php7.1的最后一个版本php7.1.25
解压压缩包,cd进去

生成configure安装文件

1
./buildconf

autoconf未安装

1
2
3
buildconf: autoconf not found
You need autoconf version 2.59 or newer installed
to build php from Git

如果出现这个报错说明缺少autoconf包管理工具

我们使用brew简单暴力

1
brew install autoconf

autoconf安装成功

再次执行

1
./buildconf

成功生成configure文件

成功生成configure文件

编译安装

后续计划研究PHP标准库中的源码实现,为了节省时间所以关掉了不必要的扩展。

参数 作用
disable-all 关闭所有扩展
enable-debug 打开编译debug
prefix 安装目录
1
2
./configure --disable-all --enable-debug --prefix=/Users/zhangjunjie/Desktop/php_c

MAC默认安装2.3版本bison不出意外会报如下错误

bison版本错误

1
2
3
configure: WARNING: You will need re2c 0 13.4 or later if you want to regenerate PHP parsers

configure: error: bison is required to build PHP/Zend when building a GIT checkout!

bison安装及版本切换

如果未出现上环节的错误可以跳跃这部分

安装bison:brew install bison
切换bison:brew switch bison

安装完毕后还需要 bison -V检测下bison是否升级切换成功,如果还是2.3的版本那么我们只有开大招,配置环境变量了

1
2
echo 'export PATH="/usr/local/Cellar/bison/3.2.1/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

然后我们再 bison -V确认下版本

bison版本

继续编译安装

重复执行编译命令

1
2
./configure --disable-all --enable-debug --prefix=/Users/zhangjunjie/Desktop/php_c
make install

如果安装成功/Users/zhangjunjie/Desktop/php_c/bin/php目录下会有PHP可执行文件,我们来验证下

1
/Users/zhangjunjie/Desktop/php_c/bin/php -v

PHP安装成功

好的大吉大利晚上吃鸡

#VSCode

下载

VS官网

下载安装这一环节就不赘述了VScode自带gdb

配置

  1. 打开我们下载的PHP源码

2.选择 调试>添加配置>Launch
添加配置

Launch

3.配置项目
配置项目

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "/Users/zhangjunjie/Desktop/php_c/bin/php",//php执行文件路径
"args": ["/Users/zhangjunjie/Desktop/1.php"],//运行参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb"
}

断点

创建一个array操作的PHP脚本

1
echo "<?php \n \$array = [1,2,3,4,2,1,2,3]; \n \$count = array_sum(\$array); \n print_r(\$array); \n print_r(\$count);" > /Users/zhangjunjie/Desktop/1.php

我们给 /Users/zhangjunjie/Desktop/php-src-PHP-7.1.25/ext/standard/array.c 5138 行 array_sum打上断点

断点

运行

运行断点

现在已经定位到了我们打的断点上,可以F10一行一行的去追代码如何执行的吧~

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~