本文主要介绍分析源码的方式,其中包含环境的搭建、分析工具的安装以及源码调试的基本操作。
一、 工具清单
- PHP7.1.10
- GDB
- Clion
二、 源码下载及安装
关于php源码的下载和安装这里就不进行赘述
三、 GDB的安装与调试
3.1 安装
GDB的安装就不介绍
3.2 调试
创建php文件: index.php
<?php
echo "Hello world!";
?>
打开gdb
$ gdb php # 将显示如下内容
GNU gdb (GDB) 8.3
Copyright (C) 2019 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-apple-darwin18.5.0".
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 php56...
(gdb)
调试创建的php文件
# 断点main函数
(gdb) b main
Breakpoint 1 at 0x1007123f0: file sapi/cli/php_cli.c, line 1215.
(gdb) run index.php
Starting program: /usr/local/bin/php56 index.php
[New Thread 0x1a03 of process 81529]
[New Thread 0x2803 of process 81529]
[New Thread 0x2703 of process 81529]
Thread 3 hit Breakpoint 1, main (argc=2, argv=0x7ffeefbff8f0) at sapi/cli/php_cli.c:1215
warning: Source file is more recent than executable.
1215 int exit_status = SUCCESS;
(gdb) next
1216 int module_started = 0, sapi_started = 0;
(gdb)
经过上面的步骤就可以使用GDB进行PHP源码的调试了。
四、CLion的配置与调试
4.1 配置
打开clion,选中菜单栏中的 File-> New Cmake project from Source...
, 选择下载的源码包。
注意: 这里选择的源码包是要使用 configure 配置过的。
在导入源码的过程中,这里使用默认的选择就可以。
导入源码之后,打开项目根目录的CMakeLists.txt
,将该文件的代码替换为下面的内容,注意版本和源码目录要根据实际位置进行调整。
cmake_minimum_required(VERSION 3.15)
project(makefile)
set(CMAKE_CXX_STANDARD 14)
set(PHP_SOURCE /Users/mihuan/workspace/c/php-7.1.10)
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 && sudo make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
完成后,要重新加载该文件的内容(CLion 会有提示,可以选择自动重载)。 然后打开菜单栏 Run->Edit Configurations...
, target 选择 makefile(这里要和CMakeLists.txt
中的project(makefile)
一致); Executable 选择PHP的可执行二进制程序;Program arguments填写要执行的脚本文件(php文件,如上面GDB调试的时候所用的index.php);Working Directory填写要执行的脚本文件的存放目录。
4.2 调试
上面配置完成之后,我们来验证一下配置是否成功。先在工作目录(上面填写的Working Directory)中创建index.php。
<?php
echo "Hello world!";
?>
回到CLion,打开sapi/cli/php_cli.c
文件,在main函数里设置断点,如下图
然后点击菜单Run->Debug makefile
,等待编译完成后,若出现下图就说明我们的努力有了回报。
说明1: 在
CMakeLists.txt
中,最后一段代码中使用了... sudo make install ...
。因为我的是Mac系统,将PHP安装到/usr/local 下面需要使用sudo。如果有权限可以不使用sudo。说明2: 在配置CLion的过程
Run->Edit Configurations...
中,Executable 需要选择PHP的可执行二进制程序。如果使用的是Mac的,并且我们的php是安装在/usr/local/
(假设是/usr/local/php) 下,那么二进制程序是不能被选择的到的。因为CLion是不能进入类似/usr/local;/usr/lib;/etc ...
等这类目录中的。所以我们需要在我们的“家”目录中选择一个地方创建一个软链接(如:/Users/jiyi/workspace/bin
) 代码如下:
$ sudo ln -s /usr/local/php/bin/php ~/workspace/bin/php
然后选择
~/workspace/bin/php
即可。说明3: 上面CMakeLists.txt 中有下面一段代码
add_custom_target(makefile COMMAND make && sudo make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
如果PHP已经编译安装完成之后,就可以不再需要
COMMAND make && sudo make install
了,它的功能是每次在CLion中点击运行/调试的时候都会先运行这两个命令——make
和sudo make install
。这样的话每次都要重新编译和安装,最恼人的是mac系统还需要每次输入用户密码,很麻烦。所以说PHP安装完成之后这部分可以去掉,形式如下
add_custom_target(makefile WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})