遇到一个php的bug,一年多了也没见得到官方去解决,早上起来git clone了php-src,决定自己来解决了。
# git clone https://github.com/php/php-src.git
# cd php-src
基于PHP-5.6.31版本做调试
# git checkout -b PHP-5.6.31 --track origin/PHP-5.6.31
# cd ext
把vld扩展直接放到php-src/ext目录中,在编译php时通过--enable-vld就可以把vld扩展编译好,如果要单独编译vld还在改 php-src/scripts/phpize 脚本文件,太麻烦了
# git clone https://github.com/derickr/vld.git
# cd ..
最小编译PHP源代码后,就开始gdb调度,-j 4不到一分钟就编译好了
./buildconf --force --debug && ./configure --disable-all --enable-cli --enable-phpdbg --enable-vld && make -j 4
先查看各条PHP代码执行时的栈,C语言的栈和PHP语言的栈
通过vld扩展查看编译后的opcode
# sapi/cli/php -dvld.active=1 -dvld.execute=0 ../php56_bug.php
.... 要出门上班了,bug还未解决(待续)
================= 插曲 =====================
在解决这个bug过程中,查看php源代码时发现一些 宏 的注释不正确,修复后提交了一个 pull requests