介绍《PHP教程:PHP调试的强悍利器之PHPDBG》开发教程,希望对您有用。
《PHP调试的强悍利器之PHPDBG》要点:
本文介绍了PHP调试的强悍利器之PHPDBG,希望对您有用。如果有疑问,可以联系我们。
PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境.PHP实战
PHPDBG的目标是成为一个轻量级、强大、易用的PHP调试平台.可以在PHP5.4和之上版本中使用.在PHP5.6和之上版本将内部集成.PHP实战
主要功能:
PHP实战
C 单步调试PHP实战
C 灵活的下断点方式(类办法、函数、文件:行、内存地址、opcode)PHP实战
C 可直接调用PHP的evalPHP实战
C 可以查看当前执行的代码PHP实战
C 用户空间API(userland/user space)PHP实战
C 便利集成PHP实战
C 支持指定PHP配置文件PHP实战
C JIT全局变量PHP实战
C readline支持(可选),终端操作更便利PHP实战
C 远程debug,使用java GUIPHP实战
C 操作简便(具体看help)PHP实战
安装
为了使用PHPdgb,你首先必要下载一个PHP的源码包.然后下载PHPdgb的源码包,并放在PHP源码包的sapi目录下.最后,你就可以执行命令安装了.编译安装示例如下:PHP实战
假设我们已经下载PHP的源码包,并放在了/home/PHP目录下.PHP实战
#cd /home/PHP/sapi
#git clone https://github.com/krakjoe/PHPdbg
#cd ../
#./buildconf --force
#./config.nice
#make -j8
#make install-PHPdbg
注意:PHP实战
1、如果你的PHP版本是PHP5.6或者更高的版本,PHPdbg已经集成在PHP的代码包中,无需单独下载了.PHP实战
2、编译参数中记得要加 Cenable-PHPdbg.PHP实战
3、编译时参数,Cwith-readline 可以选择性添加.如果不添加,PHPdbg的history等功能无法使用.PHP实战
基本使用
1、参数介绍
PHPdbg是PHP的一个sapi,它可以以命令行的方式调试PHP.常用参数如下:PHP实战
The following switches are implemented (just like cli SAPI):PHP实战
-n ignore PHP iniPHP实战
-c search for PHP ini in pathPHP实战
-z load zend extensionPHP实战
-d define PHP ini entryPHP实战
The following switches change the default behavIoUr of PHPdbg:PHP实战
-v disables quietnessPHP实战
-s enabled steppingPHP实战
-e sets execution contextPHP实战
-b boring C disables use of colour on the consolePHP实战
-I ignore .PHPdbginit (default init file)PHP实战
-i override .PHPgdbinit location (implies -I)PHP实战
-O set oplog output filePHP实战
-q do not print banner on startupPHP实战
-r jump straight to runPHP实战
-E enable step through eval()PHP实战
Note: passing -rr will cause PHPdbg to quit after execution,rather than returning to the consolePHP实战
2、常用功能
之前我们介绍过gdb工具.其实PHPdbg和gdb功能有些地方非常相似.如,可以设置断点,可以单步执行,等.只是他们调试的语言不一样,gdb侧重于调试c或者c++语言,而PHPdbg侧重于调试PHP语言.下面我们将对PHPdbg的一些常用调试功能做下介绍.要调试的代码如下:PHP实战
文件test_PHPdbg_inc.PHP源代码如下:PHP实战
<?PHP
function PHPdbg_inc_func()
{
echo "PHPdbg_inc_func \n";
}
?>
文件test_PHPdgb.PHP的源代码如下:PHP实战
<?PHP
include(dirname(__FILE__)."/test_PHPdbg_inc.PHP");
class demo{
public function __construct(){
echo __METHOD__.":".__LINE__."\n";
}
public function func($param){
$param++;
echo "method func $param\n";
}
public function __destruct(){
echo __METHOD__.":".__LINE__."\n";
}
}
function func(){
$param = "ali";
$param = $param + "baba";
echo "function func $param\n";
}
$demo = new demo();
$demo->func(1);
func();
PHPdbg_inc_func();
?>
3、启动PHPdbgPHP实战
PHPdbg安装成功后,会在安装目录的bin目录下.进入bin目录,直接输入PHPdbg即可.如下:PHP实战
#PHPdeg
[Welcome to PHPdbg,the interactive PHP debugger,v0.4.0]
To get help using PHPdbg type "help" and press enter
[Please report bugs to <http://github.com/krakjoe/PHPdbg/issues>]
prompt>
要想加载要调试的PHP脚本,只必要执行exec命令即可.如下:PHP实战
#PHPdbg
......
prompt> exec ./test_PHPdbg.PHP
当然我们也可以在启动PHPdbg的时候,指定e参数.如下:PHP实战
#PHPdbg -e ./test_PHPdbg.PHP
4、查看赞助信息PHP实战
如果你之前使用过其他的调试工具,你会发现PHPdbg和他们比较相似.但是,你使用初期,还是会经常需要获取赞助信息.通过help命令我们可以获取赞助信息.PHP实战
......
prompt> help
PHPdbg is a lightweight,powerful and easy to use debugging platform for PHP5.4+
It supports the following commands:
Information
list list PHP source
......
5、设置断点PHP实战
设置断点的命令和gdb一样.都是break,简写形式为b.不过具体的命令参数还是有所差异的.和gdb的断点命令相同之处,它们都可以“按文件名:行号” 或者 行号的方式设置断点.除此之外,PHPdbg还提供了一些针对PHP特有的设置断点的方式.如,根据opline设置断点,根据opcode设置断点等.PHP实战
众所周知,PHP代码最终是解析成opcode,然后由PHP内核一条条执行.一条PHP语句,可能会解析成多条opcode.如果可以按opcode设置断点,我们就可以更精确的跟踪程序执行过程.下面我们来看看phapdbg设置断点的具体示例.PHP实战
按opline设置断点:PHP实战
这里所说的opline,就是以办法入口作为起点,当前代码的行号.如test_PHPdgb.PHP文件中,第18行的代码“$param = $param + “baba”;”的opline就是 2.PHP实战
......
prompt> b func#2
prompt> r
demo::__construct:5
method func 2
[Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)]
[Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)]
[Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)]
[Breakpoint #0 in func()#2 at ./test_PHPdbg.PHP:18,hits: 1]
>00018: $param = $param + "baba";
00019: echo "function func $param\n";;
00020: }
......
6、查看断点PHP实战
和gdb一样,PHPdbg也是使用info break命令查看断点.示例如下:PHP实战
....
prompt> info break
------------------------------------------------
File Breakpoints:
#1 /home/hailong.xhl/test_PHPdbg.PHP:10
------------------------------------------------
Opline Breakpoints:
#0 7ff3219e1df0 (function breakpoint)
------------------------------------------------
Function opline Breakpoints:
#0 func opline 2
....
通过上面的显示,我们可以知道.info break的显示结果中会把断点的类型也给显示出来.#后面的数字是断点号.我们可以根据断点号删除断点.PHP实战
7、删除断点PHP实战
和gdb命令不一样.PHPdbg的删除断点不是delete命令,而是break del 命令.示例如下:PHP实战
......
prompt> break del 1
[Deleted breakpoint #1]
prompt>
......
break del 后面的数字1便是断点号.PHP实战
8、查看代码PHP实战
PHPdbg查看代码的命令也是list.但是和gdb相比,使用的方式更多样一些.PHP实战
显示指定函数的代码:PHP实战
......
prompt> l f func
00017: $param = "ali";
00018: $param = $param + "baba";
00019: echo "function func $param\n";;
00020: }
00021:
prompt>
......
单步执行PHP实战
PHPdbg的单步执行只有一个命令 step.和gdb的step命令差不多.都是一行一行的执行代码.注意,PHPdbg是没有next命令的.PHP实战
....
prompt> s
[Breakpoint #0 resolved at func#2 (opline 0x152ba40)]
[L19 0x152ba70 ZEND_ADD_STRING C2 @0 ./test_PHPdbg.PHP]
>00019: echo "function func $param\n";;
00020: }
00021:
....
继续执行PHP实战
和gdb一样,PHPdbg的继续执行命令也是continue,简写形式为c.PHP实战
执行PHP代码PHP实战
这个是PHPdbg的一个特色.可以在调试的过程中使用ev命令执行任意的PHP代码.如:PHP实战
......
prompt> ev $var = "val";
val
prompt> ev var_dump($var);
string(3) "val"
......
可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果.PHP实战
以上便是本文的全部内容,轻松玩转调试利器PHPDBG,希望大家喜欢.PHP实战
欢迎参与《PHP调试的强悍利器之PHPDBG》讨论,分享您的想法,编程之家 jb51.cc为您提供专业教程。