探索 PHP 源码(〇)——定制可调试的 PHP 解释器

探索PHP源码时,定制编译是挺重要的,毕竟预先编译发行版是没有调试功能的。

首先安装编译工具(debian系统):

$ sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev

这些工具也不需要记,https://github.com/php/php-src上都有。

编译

以下是自用的编译脚本:

$ make clean \
&& PREFIX_DIR=$PWD/output \
&& rm -rf $PREFIX_DIR \
&& ./buildconf -f \
&& INI_DIR=$PREFIX_DIR/ini \
&& ./configure \
--enable-debug \
--prefix=$PREFIX_DIR \
--with-config-file-path=$INI_DIR \
&& echo $PREFIX_DIR \
&& echo $INI_DIR \
&& sleep 5 \
&& make \
&& make install \
&& mkdir -p $INI_DIR \
&& cp $PWD/php.ini-production $INI_DIR/php.ini \
&& EXT_DIR=`$PWD/output/bin/php-config --extension-dir` \
&& echo $EXT_DIR \
&& echo "extension_dir=${EXT_DIR}" >> $INI_DIR/php.ini

./configure脚本可配的参数比较多,根据需要添加减少,./configure --help查看所有选项。

如果使用macosm系列芯片,还需要添加--with-iconv=/opt/homebrew/opt/libiconv。通过brew安装iconv的话,可以根据brew info libiconv来获取路径。

如果要用composer测试,需要再加几个,--with-openssl--with-openssl-dir=/usr/include/openssl--enable-phar--enable-filter--enable-iconv,记得配置phar.readonly=Off

调试

工具:vscode。运行调试配置,.vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug php source",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/output/bin/php",
            "args": ["-f", "${workspaceRoot}/phps/hello.php"],
            "stopAtEntry": true,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "make"
        }
    ]
}

如果不需要前置任务,preLaunchTask不用设置。不过为了方便修改源码,我给添加了一个编译安装任务,preLaunchTask的值为.vscode/tasks.jsonlabel值,.vscode/tasks.json配置如下,command根据实际填写:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "make",
            "command": "cd /xxx/php-src && make && make install",
            "args": [
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

接下来,创建phps/hello.php,添加断点,点击Start Debugging即可开启PHP源码的大门。

Search

    Table of Contents