调试原理:将父进程作为监听进程,子进程运行程序代码,这样所有的信号都需要经过父进程,所以也就可以控制调试了.
调试的必要的几个因素:
1. 有调试符号的可执行文件,类似 gcc -g aa.c出来的a.out
2. 能找到源码文件,也就是aa.c文件,php源码也是如此.
3. 满足以上两个条件,就可以顺利调试,理解这点很重要
只有自己亲手实践了,才知道是如此的简单。先理解如何愉快的调试,才是开发扩展的第一步,除非你不想深入学习。
- 下载好php源码包,然后编译安装debug版本的php。
- 写一个简单的扩展。
- 将扩展代码导入到clion中,记住只是扩展代码。
- 配置CMakeLists.txt文件,从php源码中导入。
- 配置gdb运行环境,deubg,跑起来
安装
sudo ./configure --prefix=/usr/local/php7_debug --enable_debug
生成扩展
sudo ./ext_skel --extname=lion
clion导入扩展源码
clion->import project from sources
引入php源码当中的头文件
cmake_minimum_required(VERSION 3.7)
project(lion)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES
lion.c
php_lion.h)
add_executable(lion ${SOURCE_FILES})
#定义php源码路径,这里根据自己的真实路径来更改
set(PHP_SOURCE /usr/local/src/php-7.1.4)
#引入php需要的扩展源码,这里也是根据自己需要的来更改
include_directories(${PHP_SOURCE}/main)
include_directories(${PHP_SOURCE}/Zend)
include_directories(${PHP_SOURCE}/sapi)
include_directories(${PHP_SOURCE}/pear)
include_directories(${PHP_SOURCE})
add_custom_target(makefile COMMAND sudo /usr/local/phpdebug/bin/phpize && ./configure --with-php-config=/usr/local/phpdebug/bin/php-config && make
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
clion配置中如此设置
好了,跑吧,让程序乖乖的停在任意断点.
如何调试php源码呢?
vscode调试php内核
vscode是一个非常轻量级的编辑器,微软的良心之作,今天就用他来开发和调试php的内核或者扩展非常的方便。
- 安装c/c++插件
- 配置lanunch.json和tasks.json
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "php_core_haha",
"type": "cppdbg",
"request": "launch",
"program": "/usr/local/phpdebug/bin/php",
"args": ["/Users/lion/wwwroot/php/aa.php"],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb",
"preLaunchTask": "php_ext_task"
}
]
}
tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"taskName": "php_ext_task",
"type": "shell",
"command": "cd /usr/local/src/php-7.1.4/ext/lion && sudo /usr/local/phpdebug/bin/phpize && ./configure --with-php-config=/usr/local/phpdebug/bin/php-config && make",
"problemMatcher": [
"$gcc"
]
}
]
}
成功后图片