使用GDB调试PHP代码

Posted by jintang on 2016-08-22

首先安装gdb

1
yum install -y gdb

PHP编译需要加上–enable-debug参数

1
./configure --prefix=/usr/local/php --enable-debug

编写一段PHP代码

test.php

1
2
3
4
5
<?php
$a = 1;
echo $a;
$b = $a;
echo $b;

开始调试:

1
gdb /usr/local/php/bin/php

设置断点, ZEND_ECHO_SPEC_CV_HANDLER 是 echo函数

1
2
(gdb) b ZEND_ECHO_SPEC_CV_HANDLER
Breakpoint 1 at 0x8a00ec: file /root/php/Zend/zend_vm_execute.h, line 28269.

运行test.php

1
2
3
4
5
6
7
8
9
(gdb) r test.php 
Starting program: /usr/local/php71/bin/php test.php
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, ZEND_ECHO_SPEC_CV_HANDLER () at /root/software/php-7.1.0/Zend/zend_vm_execute.h:34640
34640 SAVE_OPLINE();
(gdb) n
34641 z = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);

获得z变量,打印一下

结合zval定义看出,type = 4 正是一个整型,应该取lval的值,刚好lval=1