当接触到PHP内核,或者说PHP解释器相关的开发时,调试自然也是一个无法绕过的话题。但不知为何,我搜了一圈,无论中文还是英文的资料,找到的要么是调试PHP代码,而非PHP解释器,要么就是在Linux下用gdb去进行调试,并没有在Windows下的相关教程,因此我就决定还是自己来写一篇吧。
在开始之前,需要说明的是,本文侧重在如何去进行调试,因此会假定你已经有一些基础知识,比如能够成功地搭建在Windows下的编译环境并且已经自己成功编译出一个能够执行的PHP解释器了。
并不知道如何在Windows下编译出一个PHP解释器?没关系,PHP官方提供了一份同样是手把手的教程来教你。什么?你说你看不懂英文?不会装visual studio?唔,我只能说,编译一个PHP解释器这件事情还是有一些门槛的,而且比用PHP写程序高得多,所以我也爱莫能助了o(╯□╰)o
首先,你要编译出一个带debug symbols的PHP,也就是在configure
的时候记得带上--enable-debug
,例如(为了简化说明,本文中仅编译了cli一个sapi,并且没有启用任何扩展):
buildconf --force configure --disable-all --enable-cli --enable-debug nmake |
如图,如果你成功地编译完了,那么一个php.exe
应该已经在 Debug_TS 目录下躺着等你了。
有小朋友也许会好奇,Debug_TS 目录最后的TS是什么。这个代表着 Thread Safety,因为这不是本文想介绍的内容,所以可以自己谷歌下来查找更多的资料。如果想要关闭它的话,可以在
configure
的时候加上--disable-zts
然后,打开Visual Studio,我使用的是VS2017社区版。不同的版本也许会有细微的差别,可以参考本文最后的资料去查看不同版本的具体方法。点击『文件』——『打开』——『项目/解决方案』,找到刚才 Debug_TS 目录下的 php.exe,打开它。
下一步,打开你想要断点的源文件(你可以直接把文件拖进visual studio,我觉得这是最快的打开方式)。打上断点。
一般来说,接下来就是启动了。可是平常在命令行下我们能够直接把要执行的PHP文件名字打在后面,但是在VS中似乎点击启动就直接开始执行了,并没有这么一个机会?没关系,点击『调试』——『php属性』,在『参数』里填写你要执行的PHP文件的完整路径。如果你有更多的参数也可以一同附加在后面。
最后,点击那个绿色的小箭头(启动),开始你蛋疼愉快的调试之旅吧。
参考资料:
-
- https://wiki.php.net/internals/windows/stepbystepbuild
-
- https://msdn.microsoft.com/zh-cn/library/0bxe8ytt.aspx?f=255&MSPPError=-2147217396
你好,感谢你的分享,我在执行nmake的时候发生了错误,提示:
“-h 不是内部或外部命令………”
抱歉,因为你的评论被垃圾评论淹没了,所以现在才看到。
建议你参考官方wiki里的构建教程(我在文章里有发)重来一遍,尤其是注意VS的版本是否正确,以及是否使用了VS提供的命令行而非原生的命令行(关系到相关环境变量,当然如果你精通这一块可以当我没说)