我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

前面的php内核的文章,主要重在编译部分。本文说另外一种可能性,就是对php内核进行debug。单步调试,看代码逻辑走向。虽然这个部分听起来很复杂,但是也是一个方向对吧?另外值得说明的是:这个是对php内核的调试,实际上是c/c++语言的调试,并不是php语言的调试。

苏南大叔:php内核编译,如何使用vscode调试内核逻辑走向? - php内核调试
php内核编译,如何使用vscode调试内核逻辑走向?(图5-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文记录,使用vscode调试php内核的故事。当然了,对于目前的苏南大叔来说,说“调试”这个词有点大。或者我们换个说法,对php内核逻辑进行断点。这样似乎就可信多了。本文测试环境:win10php@7.4.28vscode@1.66.0

编译debugphp

这里就是常规编译php内核,但是需要特别注意的是:configure的参数,需要启用clidebug。比如:下面的参数参数就是个非常好的配置:

configure --disable-all --enable-cli --enable-phar --enable-debug

重点是--enable-debug,启用cli只是因为cli下比较适合本文下描述的环境。这里主要启用的是debug,只有debug是调试内核c语言的。而不是xdebug,也不是phpdbg,它们是有区别的。

可以参考文章:

安装c/c++插件

这里需要vscode安装一个c/c++插件,在插件市场里面很容易找到并安装好。如下图所示:

苏南大叔:php内核编译,如何使用vscode调试内核逻辑走向? - c++扩展
php内核编译,如何使用vscode调试内核逻辑走向?(图5-2)

注意:c++c语言的超集。两者目前都是使用visual studio里面的vc toolset进行编译的。

配置.vscode/launch.json

vscode打开phpsrc,然后在不打开.php文件的情况下,按f5键。就会有选择调试环境的选择,选择windows。然后就可以配置文件了。

苏南大叔:php内核编译,如何使用vscode调试内核逻辑走向? - c++调试
php内核编译,如何使用vscode调试内核逻辑走向?(图5-3)

下面是个配置范例:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "php source code debugger",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${workspaceFolder}/x64/Debug_TS/php.exe",
            "args": ["info.php"],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}/x64/Debug_TS/",
            "environment": [],
            "console": "externalTerminal"
        }
    ]
}

苏南大叔:php内核编译,如何使用vscode调试内核逻辑走向? - 配置文件
php内核编译,如何使用vscode调试内核逻辑走向?(图5-4)

下面的是主要的配置要点:

  • program要指向debug版本的php.exe
  • cwd为了简单起见,配置php.exe所在的目录。
  • info.php是测试的php,仅仅是个引子,放置在php.exe旁边。
  • stopAtEntry要设置为true,相当于有个自动的断点。启动程序后,会自动暂停。

开始调试

vscode打开phpsrc目录后,f5开始调试,然后安装调试工具条的提示,step in或者step over即可。

  • f5,运行
  • f10,单步跳过
  • f11,单步进入
  • shift+f11,单步跳出

这里主要说一下断点位置,因为本文的调试方式是使用cli,所以入口点是:sapi/cli/php_cli.cphp_cli.c里面的main函数。而launch.json文件里面配置了stopAtEntry。开始的时候,会自动停顿,然后剩下的就是靠大家自己根据经验下断点了。

苏南大叔:php内核编译,如何使用vscode调试内核逻辑走向? - 调试断点
php内核编译,如何使用vscode调试内核逻辑走向?(图5-5)

参考文献

综述

本文讲述了windows环境下,使用vscode调试php内核的一个可能步骤。对于其它的操作系统,步骤上也应该是差不多的,这里就不做更多描述。

更多文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   vscode    phpsrc