使用Clion调试PHP原生C扩展
写本文主要目的是为了记录在Mac
下使用Clion
怎么调试PHP
源项目中自带的扩展(主要GDB调试太累也不是很熟悉, 实际是太菜了)。同时也为了更熟悉PHP
底层的运行机制,以及扩展的开发。
为什么会有这篇文章?
在写这篇文章的时候,正在做的项目中一个功能是通过文件流识别文件的MIME types
。当时第一时间想到的就是通过识别文件头里面的固定标识,然后一想这么多文件类型一个一个找太麻烦了。于是想起了PHP
中的fileinfo
扩展有这个功能,就想看看它怎么实现的。在查找一翻源码后,它是通过file -C -m ./aa.mgc
生成mgc
文件,然后通过ext/fileinfo/create_data_file.php
文件生成data_file.c
文件。程序通过解析文件中的php_magic_database
变量来获取结果 。
准备开始
在开始之前你需要把整个环境安装好。比如PHP源码,下载Clion。
环境准备
构建PHP
在构建之前你可能需要安装一些依赖库。
[$] brew install libxml2 libiconv apr apr-util bison re2c python capstone compiledb
[$] git clone https://github.com/php/php-src.git ~/Projects/rust/php-src
[$] cd ~/Projects/rust/php-src
[$] ./buildconf
[$] ./configure \
--prefix=$HOME/Projects/rust/php-src/8.4.0-dev \
--disable-all \
--disable-cgi \
--enable-debug \
--enable-zts \
--enable-fileinfo
[$] compiledb make -j4
compiledb
的作用是在make
后会生成clang
的compile_commands.json
文件。有兴趣的可以去看看compile_commands
介绍。
构建成功可以查看compile_commands
文件中的内容。
运行./sapi/cli/php -m
的结果。
[$] ./sapi/cli/php -m
[PHP Modules]
Core
date
fileinfo
hash
json
pcre
random
Reflection
SPL
standard
[Zend Modules]
配置Clion
导入项目
启动CLion
以进入欢迎屏幕并选择从现有源打开项目。选择项目目录中的compile_commands.json
文件打开。
配置自定义构建
打开CLion
后,您需要为make
和make clean
创建自定义构建目标。
打开CLion
偏好设置,进入 Build, Execution, Deployment -> Custom Build Targets。创建一个新的编译目标,命名为 “build php”。然后,在空白的 "Build "和 "Clean "字段旁边,点击更多按钮。这将打开一个外部工具窗口。使用+
按钮创建两个外部工具。整个步骤可以通过下面两个张图来配置。
配置Run/Debug
通过上面的配置自定义构建,之后就可以配置Run/Debug
的配置。您需要创建自定义运行/调试配置。为此,请点击到_Run_ -> Edit Configurations…。
图片中的6是$FilePrompt$
它JetBrains
家族中IDE
变量。这样,只要您选择在CLion
中运行PHP
,它就会提示您通过PHP
解释器执行文件对话框。这样,您就可以选择一个PHP
脚本来运行,并测试/调试您正在开发的任何功能。
现在,单击锤子图标 (🔨) 或选择 Build -> Build Project 来构建 PHP,或者选择 Build -> Clean 来运行make clean
命令。
点击图标(▶️)或选择_Run_ -> Run ‘build php’,系统会提示您选择一个文件,并将该文件作为 PHP 脚本运行。在下文中,我选择了一个 .phpt 测试以这种方式执行。
调试(Debug)
编写一个需要调试的PHP
文件,我以调试fileinfo
扩展为例。
// fileinfo.php
<?php
echo mime_content_type("/Users/meshell/Projects/rust/php-src/ext/fileinfo/tests/67647.mov");
打开ext/fileinfo/fileinfo.c
文件,找到mime_content_type
函数,在函数体中打上断点即可,之后点击🪲
图标选择需要调试的文件fileinfo.php
进行调试。
参考文章
完结
整个文章是围绕Mac
环境的配置和构建。如果你是其它的系统环境也可以参考该文章。如果你在实践操作中遇到问题,你可以给我留言,我会在第一时间内回复你的。