PHP调试的强悍利器之PHPDBG

开发技术 作者: 2024-08-19 15:00:02
介绍《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为您提供专业教程。

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_64997.html