背景
最近在阅读陈雷大神的《PHP7底层设计与源码实现》,里面在用linux命令行里的gdb,如下图
>> gdb -tui php -ex "b main" -ex "r a.php"
>> b _zend_hash_init_int
>> continue
有几个问题
1.代码不够友好(没有高亮,目录树,标签页切换)
2.gdb使用复杂 gdb使用入门
3.查看变量和展示变量都很不直观(看看那个结构体)
由于没有clion的注册码又暂时不想买,于是打起了vscode的主意
环境
我平时学习的是看鸟哥linux私房菜时安装的virtualbox 虚拟机
[root@study 5]# uname -a
Linux study.centos.vbird 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
php的源码是按照《PHP7底层设计与源码实现》下载到了/home/cxm/php-7.4.5 里
希望能在完全的linux环境中学习,所以vscode对我而言就是一个本地客户端(参考vscode 远程连接插件),
摸索
要使用vscode当然要阅读vscode的文档,尤其是c/c++相关的, 文档中从0开始让你调试C++代码,其实这个还是在远程linux上开启了一个gdb进程,然后和mac上vscode通讯的
centos上
>>> ps aux | grep gdb
但是这里涉及到两个文件 tasks.json 和 languch.json
tasks.json实际上就是对命令行的一种包装,在php源码目录里执行完./configure 会生成 makefile文件,然后make就是编译源码(而不用手动调用gcc、g++,优化级别也在makefile里,如果查看变量是optimised out 就要把CFLAGS_CLEAN 中的O2 改成 O0,gcc和make也是一个大学问)
这样我们就有了自己的tasks.json文件
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make",
"args": [],
"problemMatcher": [
"$gcc"
]
}
]
}
效果是这样的,label就是提示的那个build
这个是launch.json, 注意preLaunchTask要跟上面的tasks.json对应,我基本就是把系统的改了一下 (name, program, args, stopAtEntry/在源码第一行自动下断点/)改了一下,因为第一点php的cli程序不在根目录,第二点后面要跟个php文件才有调式的意义,这里可以看到那些${xxx}的变量,可以参考文档
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 重新编译和调试php-cli",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/sapi/cli/php",
"args": [
"/home/cxm/php7book/5/a.php"
],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
这样点击左上角的绿色三角就可以调试了,中上方那一排按钮就是下一步,继续之类的,和其他IDE一样
效果如下图,是不是很棒
如何调试php拓展
…
总结
1.linux机器上下载php源码
2.运行configure生成makefile
3.在vscode里安装c/c++插件
4.在vscode里远程打开项目
5.在.vscode里新建launch.json, tasks.json
6.开启远程调试之旅~
vscode的纯英文文档看起来还有点吃力,json文件看起来也头大,但能升级自己的装备也是很值得花时间研究的。