AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# phpdbg扩展(5.6+内部集成) PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。 PHPDBG的目标是成为一个轻量级、强大、易用的PHP调试平台。可以在PHP5.4和之上版本中使用。在php5.6和之上版本将内部集成。如; ![](https://img.kancloud.cn/bf/9d/bf9df91378469686ca7670d3557a7be5_733x278.png) **主要功能:** – 单步调试 – 灵活的下断点方式(类方法、函数、文件:行、内存地址、opcode) – 可直接调用php的eval – 可以查看当前执行的代码 – 用户空间API(userland/user space) – 方便集成 – 支持指定php配置文件 – JIT全局变量 – readline支持(可选),终端操作更方便 – 远程debug,使用java GUI – 操作简便(具体看help) 安装 ``` <pre class="calibre10">``` #cd <span class="token1">/</span>home<span class="token1">/</span>php<span class="token1">/</span>sapi #git clone htt<span class="token3">[</span>ps<span class="token3">]</span><span class="token3">(</span>http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>www<span class="token3">.</span><span class="token6">111</span>cn<span class="token3">.</span>net<span class="token1">/</span>fw<span class="token1">/</span>photo<span class="token3">.</span>html<span class="token3">)</span><span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>github<span class="token3">.</span>com<span class="token1">/</span>krakjoe<span class="token1">/</span>phpdbg #cd <span class="token3">.</span><span class="token3">.</span><span class="token1">/</span> #<span class="token3">.</span><span class="token1">/</span>buildconf <span class="token1">--</span>force #<span class="token3">.</span><span class="token1">/</span>config<span class="token3">.</span>nice #make <span class="token1">-</span>j8 #make install<span class="token1">-</span>phpdbg ``` ``` 在PHP5.6和之上版本将内部集成 ## 运行时配置 这些功能的行为受php.ini中的设置影响。 **phpdbg配置选项** 名称默认多变变更日志描述[phpdbg.eol](https://www.php.net/manual/en/phpdbg.configuration.php#ini.phpdbg.eol)2PHP\_INI\_ALL自PHP 7.0.0起可用用于输出的行尾的种类。要设置该值,必须使用字符串别名之一[phpdbg.path](https://www.php.net/manual/en/phpdbg.configuration.php#ini.phpdbg.path)6自PHP 5.6.3起可用# 预定义常量 下面的常量由该扩展定义,并且仅当该扩展已编译为PHP或在运行时动态加载时才可用。 PHPDBG\_VERSION(string) PHPDBG\_FILE (int) 从PHP 7.3.0开始删除。 PHPDBG\_METHOD (int) 从PHP 7.3.0开始删除。 PHPDBG\_LINENO (int) 从PHP 7.3.0开始删除。 PHPDBG\_FUNC (int) 从PHP 7.3.0开始删除。 PHPDBG\_COLOR\_PROMPT (int) PHPDBG\_COLOR\_NOTICE (int) PHPDBG\_COLOR\_ERROR (int) # 函数: - [phpdbg\_break\_file](https://www.php.net/manual/en/function.phpdbg-break-file.php)—在文件的一行插入一个断点 - [phpdbg\_break\_function](https://www.php.net/manual/en/function.phpdbg-break-function.php)—在函数入口处插入一个断点 - [phpdbg\_break\_method](https://www.php.net/manual/en/function.phpdbg-break-method.php)—在方法入口处插入一个断点 - [phpdbg\_break\_next](https://www.php.net/manual/en/function.phpdbg-break-next.php)—在下一个操作码处插入一个断点 - [phpdbg\_clear](https://www.php.net/manual/en/function.phpdbg-clear.php)—清除所有断点 - [phpdbg\_color](https://www.php.net/manual/en/function.phpdbg-color.php)—设置某些元素的颜色 - [phpdbg\_end\_oplog-](https://www.php.net/manual/en/function.phpdbg-end-oplog.php)说明 - [phpdbg\_exec](https://www.php.net/manual/en/function.phpdbg-exec.php)—尝试设置执行上下文 - [phpdbg\_get\_executable](https://www.php.net/manual/en/function.phpdbg-get-executable.php)—说明 - [phpdbg\_prompt-](https://www.php.net/manual/en/function.phpdbg-prompt.php)设置命令提示符 - [phpdbg\_start\_oplog-](https://www.php.net/manual/en/function.phpdbg-start-oplog.php)说明 **命令行选项** OptionExample ArgumentDescription-c-c/my/php.iniSet php.ini file to load-d-dmemory\_limit=4GSet a php.ini directive-nDisable default php.ini-qSuppress welcome banner-vEnable oplog output-bDisable color-i-imy.initSet .phpdbginit file-IIgnore default .phpdbginit-O-Omy.oplogSet oplog output file-rRun execution context-rrRun execution context and quit after execution (not respecting breakpoints)-eGenerate extended information for debugger/profiler-EEnable step through eval, careful!-s-s=, -s=fooRead code to execute from stdin with an optional delimiter-S-ScliOverride SAPI name, careful!-l-l4000Setup remote console ports-a-a192.168.0.3Setup remote console bind address-xEnable xml output (instead of normal text output)-p-p, -p=func, -p\*Output opcodes and quit-hPrint the help overview-VPrint version number---- arg1 arg2Use to delimit phpdbg arguments and php $argv; append any $argv argument after it文件test\_phpdbg\_inc.php源代码如下: ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">phpdbg_inc_func</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"phpdbg_inc_func \n"</span><span class="token3">;</span> <span class="token3">}</span> ``` ``` 文件test\_phpdgb.php的源代码如下: ``` <pre class="calibre10">``` <span class="token4">include</span><span class="token3">(</span><span class="token4">dirname</span><span class="token3">(</span>__FILE__<span class="token3">)</span><span class="token3">.</span><span class="token2">"/test_phpdbg_inc.php"</span><span class="token3">)</span><span class="token3">;</span> class <span class="token4">demo</span><span class="token3">{</span> public <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo __METHOD__<span class="token3">.</span><span class="token2">":"</span><span class="token3">.</span>__LINE__<span class="token3">.</span><span class="token2">"\n"</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">func</span><span class="token3">(</span>$param<span class="token3">)</span><span class="token3">{</span> $param<span class="token1">++</span><span class="token3">;</span> echo <span class="token2">"method func $param\n"</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">__destruct</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo __METHOD__<span class="token3">.</span><span class="token2">":"</span><span class="token3">.</span>__LINE__<span class="token3">.</span><span class="token2">"\n"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">function</span> <span class="token4">func</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> $param <span class="token1">=</span> <span class="token2">"ali"</span><span class="token3">;</span> $param <span class="token1">=</span> $param <span class="token1">+</span> <span class="token2">"baba"</span><span class="token3">;</span> echo <span class="token2">"function func $param\n"</span><span class="token3">;</span> <span class="token3">}</span> $demo <span class="token1">=</span> <span class="token5">new</span> <span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $demo<span class="token1">-</span><span class="token1">></span><span class="token4">func</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">func</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">phpdbg_inc_func</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> ``` ``` **启动phpdbg** phpdbg安装成功后,会在安装目录的bin目录下(windows是与php.exe同级目录)。进入bin目录,直接输入phpdbg即可。如下: ![](https://img.kancloud.cn/5e/20/5e20c80796150d7ed8f03cd928ff77de_590x141.png) 要想加载要调试的php脚本,只需要执行exec命令即可(win下需要绝对路径?相对失败了)。如下: ``` <pre class="calibre10">``` exec <span class="token3">.</span><span class="token1">/</span>test_phpdbg<span class="token3">.</span>php <span class="token">//exec D:\phpstudy_pro\WWW\www.test.com\audit\test_phpdgb.php</span> ``` ``` ![](https://img.kancloud.cn/c9/b0/c9b0fab8d8732c0b77c0d7367dec382e_573x72.png) 当然我们也可以在启动phpdbg的时候,指定e参数。如下: ``` <pre class="calibre10">``` phpdbg <span class="token1">-</span>e <span class="token3">.</span><span class="token1">/</span>test_phpdbg<span class="token3">.</span>php ``` ``` **设置断点** 设置断点的命令和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。 ``` <pre class="calibre10">``` prompt<span class="token1">></span> b func#<span class="token6">2</span> ``` ``` ``` <pre class="calibre10">``` prompt<span class="token1">></span> r ``` ``` ![](https://img.kancloud.cn/59/93/5993f0f9181904dc2139889f24707374_743x240.png) **查看断点:** ``` <pre class="calibre10">``` info <span class="token5">break</span> ``` ``` ![](https://img.kancloud.cn/ac/dc/acdc58d8fccdcbabdffebff9bb2bf076_400x117.png) info break的显示结果中会把断点的类型也给显示出来。#后面的数字是断点号。我们可以根据断点号删除断点 **删除断点:** ``` <pre class="calibre10">``` <span class="token5">break</span> del <span class="token6">0</span> ``` ``` ![](https://img.kancloud.cn/f8/21/f82164e7468335c08a8dd125d73d7144_225x46.png) **查看代码** 显示指定函数的代码: ...... l f func ...... ![](https://img.kancloud.cn/f6/8b/f68b07900a04712363c0a75ef0003903_369x97.png) 单步执行 step , 简写s。 .... s .... 继续执行命令是continue,简写形式为c。 .... c .... 执行php代码 可以在调试的过程中使用ev命令执行任意的php代码。如: ``` <pre class="calibre10">``` prompt<span class="token1">></span> ev $var <span class="token1">=</span> <span class="token2">"val"</span><span class="token3">;</span> val prompt<span class="token1">></span> ev <span class="token4">var_dump</span><span class="token3">(</span>$var<span class="token3">)</span><span class="token3">;</span> <span class="token4">string</span><span class="token3">(</span><span class="token6">3</span><span class="token3">)</span> <span class="token2">"val"</span> ``` ``` 可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。 - - - - - - **查看帮助信息获取更多用法** 通过help命令我们可以获取帮助信息 ``` <pre class="calibre17">``` help ``` ```