PHP内核调试学习环境配置

PHP的编译与安装

基于PHP 7.1的版本。具体步骤如下:

下载源代码并解压

	[root@bogon src]#  pwd
	/usr/local/src
	[root@bogon src]#  wget http://jp2.php.net/distributions/php-7.1.26.tar.gz
	[root@bogon src]#  tar -xzvf php-7.1.26.tar.gz
	[root@bogon src]#  cd php-7.1.26
	[root@bogon php-7.1.26]#  pwd
	/usr/local/src/php-7.1.26

编译前配置

与其他软件安装相同,PHP也使用./configure命令进行编译前选项配置,在配置过程中可能会提示缺少某些依赖库或组件的提示,基本上上百度谷歌一下csdn就解决了,本篇不赘述。如下是我的配置命令:

	[root@bogon php-7.1.26] ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc 
	--enable-pdo --with-pdo-mysql --with-mysql-sock=/var/lib/mysql/mysql.sock  
	--enable-mbstring --enable-fpm --enable-debug --enable-maintainer-zts --enable-embed

不难发现,除去路径,MySQL和开启fpm等常规配置,还有三个配置需要注意:

  • --enable-debug: 顾名思义,就是打开调试模式
  • --enable-maintainer-zts: 打开PHP的线程安全机制,对于调试PHP源代码来说不是必须,但对于我们开发线程安全的扩展则是必须的。
  • --enable-embed: 主要用在你做php的嵌入式开发的场景中,把php作为apache的一个module进行编译,得到libphp5.so。对于一般的调试和开发扩展不是必须。

PHP使用C语言写的,其本质是个二进制ELF格式的执行文件。此次配置的实质有两个:

  1. 打开gcc的“-g -O0”的编译选项,禁止gcc编译时进行优化,
  2. 在二进制文件中保留PHP执行不需要,但调试必须的信息,如变量名称,函数名称,二进制代码和源代码的对应关系等。

编译、测试和安装

	[root@bogon php-7.1.26] make
	[root@bogon php-7.1.26] make test  //很耗时,可选步骤,目的单元测试
	[root@bogon php-7.1.26] make install
	[root@bogon php-7.1.26] cd /usr/local/php/etc
	[root@bogon etc]# pwd
	/usr/local/php/etc
	[root@bogon etc]# cp /usr/local/src/php-7.1.26/php.ini-development ./php.ini
	[root@bogon etc]# cp php-fpm.conf.default php-fpm.conf

安装完成后,可执行文件php、php-config、phpize位于/usr/local/php/bin中,php-fpm位于/usr/local/php/sbin中,为使用方便,可将其软链接到/usr/bin或/usr/local/bin中。

Vim及其相关插件配置

在Windows中查看源代码首推的source insight,在Linux通常使用Vim+Ctags+TagList+NERDTree实现,开始阶段可能会感觉不如鼠标点来点去方便,但熟悉之后,会觉得非常好用。

Ctags的安装

Ctags实际上是一个独立的软件程序,不是Vim的插件,它的安装遵循一般Linux安装的步骤流程:

	[root@bogon src]#  pwd
	/usr/local/src
	[root@bogon src]# wget https://jaist.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz
	[root@bogon src]#  tar -xzvf ctags-5.8.tar.gz
	[root@bogon ctags-5.8]# ./configure
	[root@bogon ctags-5.8]# make 
	[root@bogon ctags-5.8]# make install
	[root@bogon ctags-5.8]# whereis ctags
	ctags: /usr/bin/ctags /usr/local/bin/ctags /usr/share/man/man1/ctags.1.gz /usr/share/man/man1p/ctags.1p.gz 
	// 说明安装成功

TagList的安装与配置

TagList不同于ctags,它是vim的一个插件,因此遵循Vim插件安装流程。
首先下载,解压,如下:

	[root@bogon src]# wget https://jaist.dl.sourceforge.net/project/vim-taglist/vim-taglist/4.6/taglist_46.zip
	[root@bogon src]# unzip taglist_46.zip
	[root@bogon src]# ll
	总用量 52
	drwxr-xr-x. 2 root root    25 3月  14 19:25 doc
	drwxr-xr-x. 2 root root    25 3月  14 19:25 plugin
	-rw-r--r--. 1 root root 51455 2月  27 2013 taglist_46.zip

注意,doc和plugin是vim插件标配的两个目录,将其拷贝到对应的vim目录下是安装vim插件的第一个过程。我平时看代码一般不会用root权限,因此我在配置之前切换我的一个普通账户,并置于根目录处,如下图。

将taglist解压后doc下和plugin下taglist.txt和taglist.vim文件拷贝到/home/ctl/.vim目录下的doc和plugin文件夹下。如果没有.vim目录则新建一个。 如下图。

	[ctl@bogon ~]$ pwd
	/home/ctl
	[ctl@bogon ~]$ tree .vim
	.vim
	├── doc
	│   └── taglist.txt
	└── plugin
    	└── taglist.vim
    	
	2 directories, 2 files

至此,taglist安装完成,实际上这个时候已经可以使用taglist了,为了优化使用,有几个配置可写入vim的配置文件。

切成root权限,打开vim /etc/vimrc,添加如下内容。

"Taglists
let Tlist_Enable_Fold_Column = 0
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window = 1

NERDTree的安装

NERDTree同TagList一样,也是vim的一个插件,所以安装流程同Ctags,下载解压后,将plugin和doc下相应的文件拷贝到.vim目录中的plugin和doc目录下。

	 [root@bogon src]$ wget https://www.vim.org/scripts/download_script.php?src_id=17123
	 [ctl@bogon ~]$ pwd
	/home/ctl
	[ctl@bogon ~]$ tree .vim
	.vim
	├── doc
	│   ├── NERD_tree.txt
	│   └── taglist.txt
	└── plugin
    	├── NERD_tree.vim
    	└── taglist.vim

2 directories, 4 files

NERDTree安装完成。

使用Vim查看PHP源代码

进入PHP源码目录,并解析源文件生成tags标识符记录文件:

	[ctl@bogon php-7.1.26]$ pwd
	/usr/local/src/php-7.1.26
	[ctl@bogon php-7.1.26]$ ctags -R .   // 此命令执行将生成tags符号文件

随意打开个文件,vim sapi/cli/php_cli_server.c,开启NerdTree和tglist,如下图所示效果图:
在这里插入图片描述
NERDTree和TagList的具体使用,上百度谷歌一下csdn即可,此处不赘述。

用GDB调试PHP程序

gdb作为Linux的标配,无需额外专门安装,如果太旧的系统,可考虑升级到最新版。这里用一个最简单的php程序文件,test.php 示例一下:

<?php
    echo 'abcdef' . PHP_EOL;

执行如下:

	[ctl@bogon documents]$ /usr/local/php/bin/php test.php
	abcdef
	[ctl@bogon documents]$

用gdb调试此程序,简单查看php内核Zend的执行流程:
在这里插入图片描述
下面说明一下每一步的操作含义:
1、启动gdb,开始调试php的二进制可执行文件;
2、设置断点,ZEND_SPEC_CONST_HANDLER就是echo语句,在Zend内部的实现;
3、执行test.php脚本文件,文件名作为参数传入;
4、在断点处,查看此时的栈帧情况;
5、继续执行test.php脚本;
6、执行结果。

此外,gdb调试时,可能会报缺少调试信息的错误,不要紧,按提示安装即可。
如下图,我遇到的错误,用root执行use后面的命令 即debugin-install … 就可以了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值