PHP(php-src)をコンパイルしてデバッグしてみたくなったので手順を残しておく。
環境
VS Code
でDev Container
環境を構築します。
ディレクトリ
|- .devcontainer/
| |- devcontainer.json
| |- Dockerfile
|
|- .vscode/
| |- launch.json
|
|- php-src/
|
|- test.php
コンテナの設定
Deockerfile
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y make \
git zip unzip gcc gdb autoconf bison re2c pkg-config libxml2-dev libsqlite3-dev
CMD ["/bin/bash"]
- 基本的なPHPのビルドに必要なツールをインストールする
devcontainer.json
devcontainer.json
{
"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cpptools"
]
}
}
}
-
C/C++
の拡張機能をインストールされるようにする - 必要な拡張がある場合はここで追加しておく
デバッグ用の設定
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Main",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/php-src/sapi/cli/php", // ビルドしたPHP (CLI) のパス
"args": ["${workspaceFolder}/test.php"], // 検証したいPHPスクリプトのパス
"stopAtEntry": false,
"cwd": "${workspaceFolder}/",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
- GUIでデバッグできるように設定する
PHPをビルドする
git clone https://github.com/php/php-src.git
cd php-src
./buildconf
./configure --enable-debug
make -j4
cd ..
ビルドすると、./sapi/cli/php
にPHPのCLIが作成される
動作確認
> ./php-src/sapi/cli/php --version
PHP 8.5.0-dev (cli) (built: Dec 15 2024 17:10:01) (NTS DEBUG)
Copyright (c) The PHP Group
Zend Engine v4.5.0-dev, Copyright (c) Zend Technologies
デバッグをする
試しにvar_dump
をデバッグしてみる
test.php
<?php
var_dump("あ");
実行とデバッグ
からデバッグの開始
を実行する
まとめ
開発チームでPHPのバージョンアップ対応を進める中でPHPの挙動を確認するためにphp-srcを見たり、PHPのカンファレンスで話を聞く中でPHPの中身をいじってみたいと興味が湧いてきたのでデバッグしてみました。
今後はAST
(抽象構文技)とかOpecodeとかも理解したいなぁと考えています。