php调试利器之phpdbg

简介:
简介

PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。

PHPDBG的目标是成为一个轻量级、强大、易用的PHP调试平台。可以在PHP5.4和之上版本中使用。在php5.6和之上版本将内部集成。

主要功能:

- 单步调试

- 灵活的下断点方式(类方法、函数、文件:行、内存地址、opcode)

- 可直接调用php的eval

- 可以查看当前执行的代码

- 用户空间API(userland/user space)

- 方便集成

- 支持指定php配置文件

- JIT全局变量

- readline支持(可选),终端操作更方便

- 远程debug,使用java GUI

- 操作简便(具体看help)

安装

为了使用phpdgb,你首先需要下载一个php的源码包。然后下载phpdgb的源码包,并放在php源码包的sapi目录下。最后,你就可以执行命令安装了。编译安装示例如下:
假设我们已经下载php的源码包,并放在了/home/php目录下。


#cd /home/php/sapi
#git clone https://github.com/krakjoe/phpdbg
#cd ../
#./buildconf --force
#./config.nice
#make -j8
#make install-phpdbg

注意:
1、如果你的php版本是php5.6或者更高的版本,phpdbg已经集成在php的代码包中,无需单独下载了。
2、编译参数中记得要加 --enable-phpdbg。
3、编译时参数,--with-readline 可以选择性添加。如果不添加,phpdbg的history等功能无法使用。

基本使用

参数介绍

phpdbg是php的一个sapi,它可以以命令行的方式调试php。常用参数如下:

The following switches are implemented (just like cli SAPI):
-n ignore php ini
-c search for php ini in path
-z load zend extension
-d define php ini entry
The following switches change the default behaviour of phpdbg:
-v disables quietness
-s enabled stepping
-e sets execution context
-b boring - disables use of colour on the console
-I ignore .phpdbginit (default init file)
-i override .phpgdbinit location (implies -I)
-O set oplog output file
-q do not print banner on startup
-r jump straight to run
-E enable step through eval()
Note: passing -rr will cause phpdbg to quit after execution, rather than returning to the console

常用功能

之前我们介绍过gdb工具。其实phpdbg和gdb功能有些地方非常相似。如,可以设置断点,可以单步执行,等。只是他们调试的语言不一样,gdb侧重于调试c或者c++语言,而phpdbg侧重于调试php语言。下面我们将对phpdbg的一些常用调试功能做下介绍。
要调试的代码如下:
文件test_phpdbg_inc.php源代码如下:


<?php 
function phpdbg_inc_func()
{     
    echo "phpdbg_inc_func \n"; 
} 
?>

文件test_phpdgb.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();
?>

启动phpdbg
phpdbg安装成功后,会在安装目录的bin目录下。进入bin目录,直接输入phpdbg即可。如下:


#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命令即可。如下:


#phpdbg
......
prompt> exec ./test_phpdbg.php

当然我们也可以在启动phpdbg的时候,指定e参数。如下:


#phpdbg -e ./test_phpdbg.php

查看帮助信息
如果你之前使用过其他的调试工具,你会发现phpdbg和他们比较相似。但是,你使用初期,还是会经常需要获取帮助信息。通过help命令我们可以获取帮助信息。


......
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
......

设置断点
设置断点的命令和gdb一样。都是break,简写形式为b。不过具体的命令参数还是有所差异的。和gdb的断点命令相同之处,它们都可以“按文件名:行号” 或者 行号的方式设置断点。除此之外,phpdbg还提供了一些针对php特有的设置断点的方式。如,根据opline设置断点,根据opcode设置断点等。

众所周知,php代码最终是解析成opcode,然后由php内核一条条执行。一条php语句,可能会解析成多条opcode。如果可以按opcode设置断点,我们就可以更精确的跟踪程序执行过程。下面我们来看看phapdbg设置断点的具体示例。

按opline设置断点:
这里所说的opline,就是以方法入口作为起点,当前代码的行号。如test_phpdgb.php文件中,第18行的代码“$param = $param + "baba";”的opline就是 2。


......
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: }
......

查看断点
和gdb一样,phpdbg也是使用info break命令查看断点。示例如下:


....
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的显示结果中会把断点的类型也给显示出来。#后面的数字是断点号。我们可以根据断点号删除断点。

删除断点
和gdb命令不一样。phpdbg的删除断点不是delete命令,而是break del 命令。示例如下:


......
prompt> break del 1
[Deleted breakpoint #1]
prompt>
......

break del 后面的数字1就是断点号。

查看代码
phpdbg查看代码的命令也是list。但是和gdb相比,使用的方式更多样一些。
显示指定函数的代码:

......
prompt> l f func
 00017:     $param = "ali";
 00018:     $param = $param + "baba";
 00019:     echo "function func $param\n";;
 00020: }
 00021:
prompt>
......

单步执行
phpdbg的单步执行只有一个命令 step。和gdb的step命令差不多。都是一行一行的执行代码。注意,phpdbg是没有next命令的。


....
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:
....

继续执行
和gdb一样,phpdbg的继续执行命令也是continue,简写形式为c。

执行php代码
这个是phpdbg的一个特色。可以在调试的过程中使用ev命令执行任意的php代码。如:


......
prompt> ev $var = "val";
val
prompt> ev var_dump($var);
string(3) "val"
......

可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
算法 IDE PHP
PHP编程中的错误处理与调试技巧
在PHP编程过程中,错误处理和调试是至关重要的环节。本文将介绍一些常见的PHP错误类型、优秀的调试工具以及有效的调试技巧,帮助开发者更高效地定位和解决代码中的问题。
176 3
|
7月前
|
关系型数据库 MySQL PHP
利用PhpStorm、phpstudy和xdebug快速构建PHP调试环境
至此,我们已经完成了PHP调试环境的构建。现在,你可以在PhpStorm中打开你的PHP项目,设置断点,然后开始调试你的代码了。希望这个指南能帮助你快速构建PHP调试环境,提高你的开发效率。
455 26
|
IDE PHP 开发工具
【PHP开发专栏】Xdebug在PHP调试中的应用
Xdebug 是一个功能强大的 PHP 扩展,提供调试、代码分析和性能分析等功能。本文介绍了 Xdebug 的基本概念、安装配置方法及在 PHP 调试中的应用技巧,包括断点调试、堆栈跟踪、远程调试和性能分析等。通过合理使用 Xdebug,可以显著提高调试效率和代码质量。
283 3
|
监控 IDE PHP
php xdebug的配置、调试、跟踪、调优、分析
php xdebug的配置、调试、跟踪、调优、分析
|
测试技术 PHP 数据库
PHP中的异常处理与错误调试
【9月更文挑战第17天】在PHP编程中,遇到问题和错误是在所难免的。了解如何正确处理这些异常,并有效地进行错误调试,是提升代码质量和开发效率的关键。本文将引导你理解PHP中的异常处理机制,并通过实际代码示例,展示如何捕捉、处理异常以及进行错误调试,帮助你构建更健壮的应用程序。
|
PHP 开发者
PHP中的异常处理与错误调试
【6月更文挑战第29天】在PHP开发过程中,异常处理和错误调试是保证代码质量与应用稳定性的重要环节。本文将深入探讨PHP的异常处理机制,介绍如何通过try-catch语句捕获异常,以及自定义异常类的创建和使用。同时,文章还将讨论PHP错误类型、错误日志记录和有效的错误调试方法,帮助开发者提高问题诊断与解决能力。
121 6
|
消息中间件 缓存 测试技术
【PHP开发专栏】PHP性能优化与调试
【4月更文挑战第30天】本文探讨了PHP的性能优化技巧和调试策略,分为三个部分:基础优化,如避免循环中的高开销操作,使用最新PHP版本和Opcode缓存;高级优化技术,包括内存管理、异步编程和性能测试;以及调试策略,如错误报告、使用Xdebug和性能分析工具。掌握这些技能有助于提升PHP应用的效率和稳定性。
163 3
|
IDE PHP 开发工具
【PHP开发专栏】Xdebug在PHP调试中的应用
【4月更文挑战第29天】Xdebug是PHP的开源扩展,用于调试和代码分析,支持断点调试、代码调用图、性能分析及远程调试。安装Xdebug可通过pecl或编译,然后配置php.ini,启用远程调试并设置IDE。调试技巧包括合理使用断点、条件断点,利用堆栈跟踪和性能分析,以及关注代码覆盖率。Xdebug能提升开发效率,帮助优化代码。
209 1
|
前端开发 PHP 开发者
PHP编程中的异常处理与调试技巧
在PHP编程中,异常处理和调试是至关重要的环节。本文将深入探讨PHP中异常处理的机制,介绍常见的异常类型以及如何合理地进行异常处理。同时,还将分享一些实用的调试技巧,帮助开发者快速定位和解决问题,提高代码质量和效率。
127 4
|
IDE PHP 开发工具
PHP编程中的错误处理与调试技巧
在PHP编程过程中,经常会遇到各种错误和bug,正确的错误处理和调试技巧对于提高代码质量和开发效率至关重要。本文将介绍PHP编程中常见的错误类型、优秀的错误处理实践以及高效的调试技巧,帮助开发者更好地应对挑战。
176 0