Table Of Contents

骑驴找蚂蚁

全干工程师

php_and_clion

使用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后会生成clangcompile_commands.json文件。有兴趣的可以去看看compile_commands介绍。

构建成功可以查看compile_commands文件中的内容。

build_php_src_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后,您需要为makemake clean创建自定义构建目标。

打开CLion偏好设置,进入 Build, Execution, Deployment -> Custom Build Targets。创建一个新的编译目标,命名为 “build php”。然后,在空白的 "Build "和 "Clean "字段旁边,点击更多按钮。这将打开一个外部工具窗口。使用+按钮创建两个外部工具。整个步骤可以通过下面两个张图来配置。

custom_build_target

create_build_tool

配置Run/Debug

通过上面的配置自定义构建,之后就可以配置Run/Debug的配置。您需要创建自定义运行/调试配置。为此,请点击到_Run_ -> Edit Configurations…

run debug configurations

图片中的6是$FilePrompt$JetBrains 家族中IDE变量。这样,只要您选择在CLion中运行PHP,它就会提示您通过PHP解释器执行文件对话框。这样,您就可以选择一个PHP 脚本来运行,并测试/调试您正在开发的任何功能。

现在,单击锤子图标 (🔨) 或选择 Build -> Build Project 来构建 PHP,或者选择 Build -> Clean 来运行make clean命令。

build php

点击图标(▶️)或选择_Run_ -> Run ‘build php’,系统会提示您选择一个文件,并将该文件作为 PHP 脚本运行。在下文中,我选择了一个 .phpt 测试以这种方式执行。

build php

build php

调试(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进行调试。

debug_extension_fileinfo

参考文章

  1. https://dev.to/ramsey/using-clion-with-php-src-4me0

完结

整个文章是围绕Mac环境的配置和构建。如果你是其它的系统环境也可以参考该文章。如果你在实践操作中遇到问题,你可以给我留言,我会在第一时间内回复你的。

相关程序解答推荐

留言