一、背景

据2019年7月份的编程排行榜,php 依然在前10,表明了 php 还是世界上最好的语言。php 的优势很多,只要场景合适,在工作中能用就用了。为了更好的理解这门语言,这几天学习下 php 的源码。网上查资料,不少人直接用 GDB 在 linux 上调试,个人感觉体验很差,容易敲错命令,因此配置了 Clion,可视化的调试 php7 源码。这里对这个步骤做了记录,包括踩的坑。

二、配置步骤

1、下载 Clion 软件

2、编译 php 源码

a、下载代码

b、配置 mac

安装 xcode ,保证cmake命令可用

安装libiconv

brew install libiconv

配置环境变量

echo 'export PATH="/usr/local/opt/libiconv/bin:$PATH"' >> ~/.zshrc

export LDFLAGS="-L/usr/local/opt/libiconv/lib"

export CPPFLAGS="-I/usr/local/opt/libiconv/include"

编译 php7

mkdir php7

./configure --prefix=~/php7 --enable-fpm --enable-debug --with-iconv=/usr/local/opt/libiconv

--prefix:编译好的文件存放的路径

--with-iconv:自己安装的libiconv路径,mac自带的与php用的不兼容,需要使用自己的

修改Makefile文件

查找 -liconv,删除 -liconv,结果长这样

EXTRA_LIBS = -lresolv -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm -lxml2 -lz -licucore -lm /usr/local/opt/libiconv/lib/libiconv.dylib

删除-liconv后,将/usr/local/opt/libiconv/lib/libiconv.dylib放在了最后

Make

Make install

3、配置 Clion

导入项目,如下图

f6af567b25a7?utm_campaign=maleskine

import.jpg

f6af567b25a7?utm_campaign=maleskine

import2.jpg

CMakeLists 导入完成后,Clion会自动生成 CMakeLists.txt,这个要根据自己的路径改下,修改示例如下

cmake_minimum_required(VERSION 3.15)

project(php_7_1_10)

set(CMAKE_CXX_STANDARD 14)

set(PHP_SOURCE ~/php-test/php-7.1.10)

include_directories(${PHP_SOURCE}/ext/bcmath)

include_directories(${PHP_SOURCE}/ext/bcmath/libbcmath)

include_directories(${PHP_SOURCE}/ext/bcmath/libbcmath/src)

include_directories(${PHP_SOURCE}/ext/bz2)

include_directories(${PHP_SOURCE}/ext/calendar)

include_directories(${PHP_SOURCE}/ext/com_dotnet)

include_directories(${PHP_SOURCE}/ext/ctype)

include_directories(${PHP_SOURCE}/ext/curl)

include_directories(${PHP_SOURCE}/ext/date)

include_directories(${PHP_SOURCE}/ext/date/lib)

include_directories(${PHP_SOURCE}/ext/dba)

include_directories(${PHP_SOURCE}/ext/dba/libcdb)

include_directories(${PHP_SOURCE}/ext/dba/libflatfile)

include_directories(${PHP_SOURCE}/ext/dba/libinifile)

include_directories(${PHP_SOURCE}/ext/dom)

include_directories(${PHP_SOURCE}/ext/enchant)

include_directories(${PHP_SOURCE}/ext/exif)

include_directories(${PHP_SOURCE}/ext/fileinfo)

include_directories(${PHP_SOURCE}/ext/fileinfo/libmagic)

include_directories(${PHP_SOURCE}/ext/filter)

include_directories(${PHP_SOURCE}/ext/ftp)

include_directories(${PHP_SOURCE}/ext/gd)

include_directories(${PHP_SOURCE}/ext/gd/libgd)

include_directories(${PHP_SOURCE}/ext/gettext)

include_directories(${PHP_SOURCE}/ext/gmp)

include_directories(${PHP_SOURCE}/ext/hash)

include_directories(${PHP_SOURCE}/ext/iconv)

include_directories(${PHP_SOURCE}/ext/imap)

include_directories(${PHP_SOURCE}/ext/interbase)

include_directories(${PHP_SOURCE}/ext/intl)

include_directories(${PHP_SOURCE}/ext/intl/breakiterator)

include_directories(${PHP_SOURCE}/ext/intl/calendar)

include_directories(${PHP_SOURCE}/ext/intl/collator)

include_directories(${PHP_SOURCE}/ext/intl/common)

include_directories(${PHP_SOURCE}/ext/intl/converter)

include_directories(${PHP_SOURCE}/ext/intl/dateformat)

include_directories(${PHP_SOURCE}/ext/intl/formatter)

include_directories(${PHP_SOURCE}/ext/intl/grapheme)

include_directories(${PHP_SOURCE}/ext/intl/idn)

include_directories(${PHP_SOURCE}/ext/intl/locale)

include_directories(${PHP_SOURCE}/ext/intl/msgformat)

include_directories(${PHP_SOURCE}/ext/intl/normalizer)

include_directories(${PHP_SOURCE}/ext/intl/resourcebundle)

include_directories(${PHP_SOURCE}/ext/intl/spoofchecker)

include_directories(${PHP_SOURCE}/ext/intl/timezone)

include_directories(${PHP_SOURCE}/ext/intl/transliterator)

include_directories(${PHP_SOURCE}/ext/intl/uchar)

include_directories(${PHP_SOURCE}/ext/json)

include_directories(${PHP_SOURCE}/ext/ldap)

include_directories(${PHP_SOURCE}/ext/libxml)

include_directories(${PHP_SOURCE}/ext/mbstring)

include_directories(${PHP_SOURCE}/ext/mbstring/libmbfl/filters)

include_directories(${PHP_SOURCE}/ext/mbstring/libmbfl/mbfl)

include_directories(${PHP_SOURCE}/ext/mbstring/libmbfl/nls)

include_directories(${PHP_SOURCE}/ext/mbstring/oniguruma)

include_directories(${PHP_SOURCE}/ext/mbstring/oniguruma/win32)

include_directories(${PHP_SOURCE}/ext/mcrypt)

include_directories(${PHP_SOURCE}/ext/mysqli)

include_directories(${PHP_SOURCE}/ext/mysqlnd)

include_directories(${PHP_SOURCE}/ext/oci8)

include_directories(${PHP_SOURCE}/ext/odbc)

include_directories(${PHP_SOURCE}/ext/opcache)

include_directories(${PHP_SOURCE}/ext/opcache/Optimizer)

include_directories(${PHP_SOURCE}/ext/openssl)

include_directories(${PHP_SOURCE}/ext/pcntl)

include_directories(${PHP_SOURCE}/ext/pcre)

include_directories(${PHP_SOURCE}/ext/pcre/pcrelib)

include_directories(${PHP_SOURCE}/ext/pcre/pcrelib/sljit)

include_directories(${PHP_SOURCE}/ext/pdo)

include_directories(${PHP_SOURCE}/ext/pdo_dblib)

include_directories(${PHP_SOURCE}/ext/pdo_firebird)

include_directories(${PHP_SOURCE}/ext/pdo_mysql)

include_directories(${PHP_SOURCE}/ext/pdo_oci)

include_directories(${PHP_SOURCE}/ext/pdo_odbc)

include_directories(${PHP_SOURCE}/ext/pdo_pgsql)

include_directories(${PHP_SOURCE}/ext/pdo_sqlite)

include_directories(${PHP_SOURCE}/ext/pgsql)

include_directories(${PHP_SOURCE}/ext/phar)

include_directories(${PHP_SOURCE}/ext/posix)

include_directories(${PHP_SOURCE}/ext/pspell)

include_directories(${PHP_SOURCE}/ext/readline)

include_directories(${PHP_SOURCE}/ext/recode)

include_directories(${PHP_SOURCE}/ext/reflection)

include_directories(${PHP_SOURCE}/ext/session)

include_directories(${PHP_SOURCE}/ext/shmop)

include_directories(${PHP_SOURCE}/ext/simplexml)

include_directories(${PHP_SOURCE}/ext/skeleton)

include_directories(${PHP_SOURCE}/ext/snmp)

include_directories(${PHP_SOURCE}/ext/soap)

include_directories(${PHP_SOURCE}/ext/sockets)

include_directories(${PHP_SOURCE}/ext/spl)

include_directories(${PHP_SOURCE}/ext/sqlite3)

include_directories(${PHP_SOURCE}/ext/sqlite3/libsqlite)

include_directories(${PHP_SOURCE}/ext/standard)

include_directories(${PHP_SOURCE}/ext/sysvmsg)

include_directories(${PHP_SOURCE}/ext/sysvsem)

include_directories(${PHP_SOURCE}/ext/sysvshm)

include_directories(${PHP_SOURCE}/ext/tidy)

include_directories(${PHP_SOURCE}/ext/tokenizer)

include_directories(${PHP_SOURCE}/ext/wddx)

include_directories(${PHP_SOURCE}/ext/xml)

include_directories(${PHP_SOURCE}/ext/xmlreader)

include_directories(${PHP_SOURCE}/ext/xmlrpc)

include_directories(${PHP_SOURCE}/ext/xmlrpc/libxmlrpc)

include_directories(${PHP_SOURCE}/ext/xmlwriter)

include_directories(${PHP_SOURCE}/ext/xsl)

include_directories(${PHP_SOURCE}/ext/zip)

include_directories(${PHP_SOURCE}/ext/zip/lib)

include_directories(${PHP_SOURCE}/ext/zlib)

include_directories(${PHP_SOURCE}/main)

include_directories(${PHP_SOURCE}/main/streams)

include_directories(${PHP_SOURCE}/netware)

include_directories(${PHP_SOURCE}/sapi/apache2handler)

include_directories(${PHP_SOURCE}/sapi/cli)

include_directories(${PHP_SOURCE}/sapi/embed)

include_directories(${PHP_SOURCE}/sapi/fpm/fpm)

include_directories(${PHP_SOURCE}/sapi/fpm/fpm/events)

include_directories(${PHP_SOURCE}/sapi/litespeed)

include_directories(${PHP_SOURCE}/sapi/phpdbg)

include_directories(${PHP_SOURCE}/TSRM)

include_directories(${PHP_SOURCE}/win32)

include_directories(${PHP_SOURCE}/Zend)

include_directories(${PHP_SOURCE})

add_custom_target(makefile COMMAND make && make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})

配置 profile

右上角会生成如下的配置(重写CMakelist后是makefile)

f6af567b25a7?utm_campaign=maleskine

config.jpg

点击 Edit Configurations,配置如下:

f6af567b25a7?utm_campaign=maleskine

make.jpg

1、创建了 CMake Applicaiton

如果没有自己可以从template中创建

2、target 选择CMakelist中自己配置的

3、找到编译文件的路径,选择生成的二进制文件

4、要运行的php文件路径参数

-f ~/test/test.php

5、工作目录,php测试文件的父目录即可

~/test/test.php

6、最后点击apply,点击ok

4、运行测试

在如下的截图处(sapi->cli->php_cli.c)添加断点,这是命令行的main入口

f6af567b25a7?utm_campaign=maleskine

brp.jpg

有的可能断点不成功,改下Debugger试试:

preference->Build,Exexuction...->Toolchains->Debugger,有lldb和gdb切换下试试,这个和电脑上安装的软件有关

运行成功的效果图如下:

f6af567b25a7?utm_campaign=maleskine

success.jpg

三、总结

简单总结就是下载php源码,编译,然后配置clion,在clion 中debug。这种方式可以很方便的debug代码,debug过程中查看代码的跳转过程,提高阅读的效率。

clion开发php,如何在 Mac 上用 Clion 调试 php7 源码相关推荐

  1. Mac上下载及编译android源码

    参考: https://blog.csdn.net/u010963246/article/details/71480684 https://blog.csdn.net/qq_25333681/arti ...

  2. Windows上VS2017单步调试FFmpeg源码的方法

    之前在https://blog.csdn.net/fengbingchun/article/details/90114411 介绍过如何在Windows7/10上通过MinGW方式编译FFmpeg 4 ...

  3. 优雅地在 Mac上使用 IDE 查看open-jdk源码

    准备工作 Homebrew Mercurial $ brew install mercurial复制代码 XQuartz JDK 8 freetype $ brew install freetype复 ...

  4. Ubuntu和Mac使用gdbserver远程调试android源码

    一.gdbserver在android上远程调试进程 0.关闭Enforcing # adb shell setenforce 01.拷贝gdb和gdbserver文件 <1>PC端为Cl ...

  5. 如何在Mac上查看网页的源码

    在mac上想查看页面的源码,点击右键查看 发现并没有类似window上的右键的查看源码的选项.是不能查看么?当然不是,这在默认情况下没有开启这样的能力. 开启步骤: 1.点击Safari ,选择&qu ...

  6. mac java模拟器_iOS学习——如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒...

    如题,本文主要研究如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒.做过安卓开发的小伙伴肯定很方便就能像打开资源管理器一样查看我们写到手机本地或应用中的各种资源,但是在iOS开发 ...

  7. python下载安装教程mac-教程|如何在mac上为Python安装XGBoost!

    原标题:教程|如何在mac上为Python安装XGBoost! 摘要:XGBoost是一个开发非常快速和准确的梯度增强模型的库,它在Kaggle数据科学竞赛中被大量的kaggle选手选用,其中包括两个 ...

  8. win10显示隐藏文件_如何在Mac上显示隐藏文件?苹果mac显示隐藏文件夹方法

    与任何操作系统一样,macOS会将重要文件隐藏起来,以防止意外删除它们并因此而损坏系统.但是,在某些情况下,您可能需要在Mac上显示隐藏文件,例如,浏览" 库"文件夹并清除旧日志, ...

  9. python numpy库安装 mac_教程|如何在mac上为Python安装XGBoost!

    原标题:教程|如何在mac上为Python安装XGBoost! 摘要:XGBoost是一个开发非常快速和准确的梯度增强模型的库,它在Kaggle数据科学竞赛中被大量的kaggle选手选用,其中包括两个 ...

最新文章

  1. 深入剖析SolrCloud(一)
  2. elk系列7之通过grok分析apache日志
  3. 【pmcaff】罗永浩昨日演讲视频:一个理想主义者的创业故事Ⅳ
  4. qt 在点击菜单下的动作之后获取该菜单的名称
  5. static--修饰(局部变量、全局变量、函数)
  6. MTK 驱动开发(17)---LCD MIPI
  7. 芜湖市计算机应用能力考试,安徽省芜湖市2021年3月计算机等级考试时间
  8. “神经网络”的逆袭:图解80年AI斗争史
  9. Numpy的使用方法
  10. 初级程序员面试不靠谱指南(二)
  11. 恐龙机器人钢索恐龙形态_恐龙有的四脚行走有的两脚行走,有的会飞有的会游,差别咋这么大...
  12. 计算机电源德国产,德国原装崇拜者来一发?BeQuiet! Straight Power 11全模电源
  13. odroid Xu4介绍
  14. Linux内核4.14版本——SPI NOR子系统(2)——spi-nor.c分析
  15. 【Java开发】中国的公历转农历-工具类
  16. vue使用地图api
  17. 心得体会标题大全_给心得起个标题
  18. Oracle 导入 txt (oracle 10) 百万数据导入 txt
  19. 如何将EXCEL中同一个工作薄多张工作表合并
  20. 使用react脚手架创建 tsx版本,react添加typescript

热门文章

  1. esxi5.1 添加vSwitch,转VM network to new vSwitch
  2. Linux的压缩相关命令(转载)
  3. 如何插入一条记录获取插入后的自动增长ID列的方法.
  4. Linux 命令(54)—— trap 命令(builtin)
  5. 常见解压缩软件与其zip格式
  6. C++ memset 栈空间出现段错误
  7. centos7永久修改ip地址
  8. leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
  9. [Android]Cygwin使用及NDK编译方法
  10. 使用sp_cycle_errorlog 命令清除sqlserver数据库错误日志