跟厂长学PHP7内核(二):源码分析的环境与工具
本文主要介绍分析源码的方式,其中包含环境的搭建、分析工具的安装以及源码调试的基本操作。
一、工具清单
- PHP7.0.12
- GDB
- CLion
二、源码下载及安装
$ wget http://php.net/distributions/php-7.0.12.tar.gz
$ tar zxvf php-7.0.12.tar.gz
$ cd php-7.0.12/
$ ./configure --prefix=/usr/local/php7 --enable-debug --enable-fpm
$ make && sudo make install
三、GDB的安装与调试
3.1 安装
本文介绍两款调试工具,分别是GDB和CLion,前者为命令行调试工具,后者为图形界面调试工具,后者依赖前者。两者的安装都很简单,Clion到官网下载即可,GDB也只需一行命令就可搞定。
$ sudo apt install gdb
3.2 调试
创建php文件
<?php
echo "Hello world!";
?>
打开gdb
$ gdb php #将显示如下内容
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from php...done.
(gdb)
调试创建的php文件
# 断点main函数
(gdb) b main
(gdb) run index.php
Starting program: /usr/local/bin/php index.php
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main (argc=2, argv=0x7fffffffcd48) at /home/enoch/Source/php-7.0.12/sapi/cli/php_cli.c:1172
1172 int exit_status = SUCCESS;
# next执行下一行
(gdb) next
1173 int module_started = 0, sapi_started = 0;
(gdb) next
1174 char *php_optarg = NULL;
(gdb) next
1175 int php_optind = 1, use_extended_info = 0;
(gdb) next
1176 char *ini_path_override = NULL;
# print可以打印变量、表达式
(gdb) print php_optarg
$1 = 0x0
关于GDB的具体指令,可以参考官方文档,这里不再一一赘述。
四、CLion的配置与调试
4.1 配置
CLion的安装就不再赘述了,下面我来讲述一下CLion是如何配置的。打开CLion,选中菜单栏中的File -> Import Project...,选择下载的PHP源码包,如图所示,点击确定。

导入之后,打开项目根目录的CMakeLists.txt文件,将该文件替换为以下内容,注意版本、源码目录要根据实际情况做调整
cmake_minimum_required(VERSION 3.13)
project(makefile)
set(CMAKE_CXX_STANDARD 11)
set(PHP_SOURCE /Users/enoch/Documents/source/php-7.3.4)
include_directories(${PHP_SOURCE}/main)
include_directories(${PHP_SOURCE}/Zend)
include_directories(${PHP_SOURCE}/sapi)
include_directories(${PHP_SOURCE}/pear)
include_directories(${PHP_SOURCE}/TSRM)
include_directories(${PHP_SOURCE})
add_custom_target(makefile COMMAND make && make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
完成后,打开菜单栏Run -> Edit Configurations...,Target选择makefile、Executable选择PHP的可执行二进制程序、Program arguments填写要执行的脚本名称、Working Directory填写要执行脚本的存放目录,配置见下图。

4.2 调试
点击完成,我们来验证一下配置是否成功。先在工作目录创建index.php文件,内容随意输入,只要是PHP代码即可。例如:
<?php
echo 'Hello world';
?>
回到CLion,打开sapi/cli/php_cli.c文件,在main函数进行断点,如下图:

加入断点后,点击菜单Run -> Debug 'makefile',等待IDE编译完成后,若出现下图即大功告成。

在debug时可能会出现以下错误,主要是因为没有操作php目录权限的缘故,我们赋予/usr/local/php7权限即可。
Installing build environment: /usr/local/php7/lib/php/build/
Installing shared extensions: /usr/local/php7/lib/php/extensions/debug-non-zts-20151012/
cp: /usr/local/php7/lib/php/build/#INST@82468#: Permission denied
make[4]: *** [install-build] Error 1
make[4]: *** Waiting for unfinished jobs....
cp: /usr/local/php7/lib/php/extensions/debug-non-zts-20151012/#INST@82475#: Permission denied
解决方式:
$ sudo chmod -R 777 /usr/local/php7/
五、备注
5.1 常见问题
no acceptable C compiler found
$ sudo apt-get install build-essential
configure: error: xml2-config not found
$ sudo apt-get install libxml2-dev
ld: symbol(s) not found for architecture x86_64
vim Makefile
# 如果是因为iconv中断的话
# 搜索-liconv,然后替换为/usr/local/homebrew/Cellar/libiconv/1.15/lib/libiconv.dylib(不同机器与版本会不同)
# 如果因为其他扩展中断也可以通过这种方式解决
5.2 Docker如何GDB调试
docker run --security-opt seccomp=unconfined -it ubuntu bash
跟厂长学PHP7内核(二):源码分析的环境与工具的更多相关文章
- PHP7内核:源码分析的环境与工具
本文主要介绍分析源码的方式,其中包含环境的搭建.分析工具的安装以及源码调试的基本操作. 一.工具清单 PHP7.0.12 GDB CLion 二.源码下载及安装 $ wget http://php.n ...
- 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06
百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...
- 跟厂长学PHP7内核(三):源码目录结构
上篇文章我们已经介绍了源码分析工具的安装.配置以及调试方法,本文我们来讲述一下PHP源码的目录结构. 一.目录概览 以php-7.0.12为例,看过源码的同学们应该发现源码目录多达十多个,下面是每个目 ...
- 跟厂长学PHP7内核(四):生命周期之开始前的躁动
上一章我们对PHP的源码目录结构有了初步了解,本章我们继续从生命周期的维度对PHP进行剖析. 一.概览 生命周期是什么呢?你可以把它看作执行过程,PHP的生命周期也就是它从开始执行到结束执行的过程. ...
- django 之(二) --- 源码分析
CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...
- MyBatis源码分析之环境准备篇
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
- 【MyBatis源码分析】环境准备
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
- Spring源码分析——(001)环境搭建
1.官方参考 spring-framework的github链接:https://github.com/spring-projects/spring-framework 源码环境搭建官方参考1:考如何 ...
- 精尽Spring MVC源码分析 - 调式环境搭建
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
随机推荐
- JavaScript 运行机制之执行顺序详解
JavaScript是一种描述型脚本语言,它不同于 Java 或 C# 等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解 JavaScript 语言的运行机制 ...
- 洛谷P3953 [NOIP2017]逛公园
K<=50,感觉可以DP 先建反图求出从n到各个点的最短路,然后在正图上DP 设f[当前点][比最短路多走的距离]=方案数 转移显然是 $f[v][res]=\sum f[u][res+tmp] ...
- C#中2个日期类型相减
DateTime startTime = Convert.ToDateTime("2017-1-9");DateTime endTime = Convert.ToDateTime( ...
- 解决Maven并行编译中出现打包错误问题的思路
解决Maven并行编译中出现打包错误问题的思路 并行构建 Maven 3.x 提供了并行编译的能力,通过执行下列命令就可以利用构建服务器的多线程/多核性能提升构建速度: mvn -T 4 clean ...
- 【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
[A]Protect Sheep 题意: 一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉. 可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的. 问是否能够保护所有的羊 ...
- Using KernelShark to analyze the real-time scheduler【转】
转自:https://lwn.net/Articles/425583/ This article brought to you by LWN subscribers Subscribers to LW ...
- Flask--wtforms快速使用和表单验证(附示例)
一.Form类 表单提供WTForms中最高级别的API.它们包含您的字段定义,委托验证,获取输入,聚合错误,并且通常用作将所有内容组合在一起的粘合剂. class wtforms.form.Form ...
- 华夏部分互联网科技公司创始及IPO信息
时间:2018-04-19 前面整理了一些美国科技公司的信息,这篇文章整理的是我华夏的一些科技公司的信息. 华为.百度.阿里.腾讯.美团.携程.京东.小米.奇虎360……之后,其它一些公司,要么体量 ...
- No.3 selenium学习之路之鼠标&键盘事件
鼠标事件 from selenium.webdriver.common.action_chains import ActionChains contest_click() 右击 double_cli ...
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...