PHPDBG、PHP デバッグ用の強力なツール
PHPDBG は、コードを変更せず、パフォーマンスに影響を与えることなく、PHP 実行環境を制御できる PHP SAPI モジュールです。
PHPDBG は、軽量で強力で使いやすい PHP デバッグ プラットフォームになることを目指しています。 PHP5.4以降で利用可能です。 php5.6 以降のバージョンでは内部的に統合されます。
主な関数:
– シングルステップ デバッグ
– 柔軟なブレークポイント メソッド (クラス メソッド、関数、ファイル:行、メモリアドレス、オペコード)
– PHP の eval を直接呼び出すことができます
– 現在実行されているコードを表示できます
– ユーザー空間 API (ユーザーランド/ユーザー空間)
– 便利な統合
– 指定された PHP 設定ファイルをサポート
– JIT グローバル変数
– Readline サポート (オプション)、ターミナル操作がより便利
– Java GUI を使用したリモート デバッグ
– 操作が簡単 (詳細はヘルプを参照)
インストール
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の履歴やその他の機能が使用できなくなります。
基本的な使い方
1. パラメータの紹介
phpdbg は、コマンドラインで php をデバッグできる php の sapi です。一般的に使用されるパラメータは次のとおりです。
次のスイッチが実装されています (cli SAPI と同様):
-n php ini を無視します
-c パス内の php ini を検索します
-zload zend extension
-d define php iniEntry
次のスイッチは phpdbg のデフォルトの動作を変更します:
-v 静粛性を無効にします
-s ステッピングを有効にします
-e 実行コンテキストを設定します
-b 退屈 – コンソールでの色の使用を無効にします
-I 無視します .phpdbginit (デフォルト) init ファイル)
-i .phpgdbinit の場所を上書きします (-I を暗黙的に示します)
-O oplog 出力ファイルを設定します
-q 起動時にバナーを印刷しません
- r ジャンプして実行します
-E ステップスルー eval()
注: -rr を渡すと、実行後に phpdbg がコンソールに戻るのではなく終了します
2. よく使われる関数
以前に 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();?>
3. 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
4. ヘルプ情報を表示します
以前に他のデバッグ ツールを使用したことがある場合は、phpdbg とそれらは比較的似ています。ただし、初めて使用するときは、ヘルプ情報を取得する必要があることがよくあります。 help コマンドを通じてヘルプ情報を取得できます。
......prompt> helpphpdbg is a lightweight, powerful and easy to use debugging platform for PHP5.4+It supports the following commands:Information list list PHP source......
5. ブレークポイントの設定
ブレークポイントを設定するコマンドは gdb と同じです。それらはすべてbreakであり、略称はbです。ただし、特定のコマンド パラメータは依然として異なります。 gdb のブレークポイント コマンドと同様に、「ファイル名: 行番号」または行番号によってブレークポイントを設定できます。さらに、phpdbg には、PHP に固有のブレークポイントを設定するためのメソッドもいくつか提供されています。たとえば、opline に基づいてブレークポイントを設定したり、opcode に基づいてブレークポイントを設定したりします。
ご存知のとおり、PHP コードは最終的にオペコードに解析され、PHP カーネルによって 1 つずつ実行されます。 PHP ステートメントは複数のオペコードに解析される場合があります。オペコードによってブレークポイントを設定できれば、プログラムの実行プロセスをより正確に追跡できます。 phapdbg を使用してブレークポイントを設定する具体的な例を見てみましょう。
opline に従ってブレークポイントを設定します。
ここで説明する opline は、メソッド エントリから始まる現在のコードの行番号です。たとえば、test_phpdgb.php ファイルでは、18 行目のコード「$param = $param + "baba";」の opline は 2 です。
......prompt> b func#2prompt> rdemo::__construct:5method 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、查看断点
和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的显示结果中会把断点的类型也给显示出来。#后面的数字是断点号。我们可以根据断点号删除断点。
7、删除断点
和gdb命令不一样。phpdbg的删除断点不是delete命令,而是break del 命令。示例如下:
......prompt> break del 1[Deleted breakpoint #1]prompt>......
break del 后面的数字1就是断点号。
8、查看代码
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";valprompt> ev var_dump($var);string(3) "val"......
可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。
以上就是本文的全部内容,轻松玩转调试利器PHPDBG,希望大家喜欢。
延伸阅读
《PHP高级知识进阶》系列技术文章整理收藏
1PHP调试的强悍利器之PHPDBG
2PHP 性能分析(一): XHProf & XHGui 介绍
3现在写 PHP,你应该知道这些
4PHP 之 FastCGI 与 mod_php 详解
5PHP 性能分析与实验:性能的微观分析
6PHP配置文件php.ini中文翻译(全)
7PHP的命令行命令使用指南
8在Linux系统的服务器上隐藏PHP版本号的方法
9PHP SOCKET编程详解
10php中关于socket的系列函数总结
11正确的PHP匹配UTF-8中文的正则表达式
12PHP性能分析工具XHProf安装使用教程
13百度工程师讲PHP函数的实现原理及性能分析(三)
14百度工程师讲PHP函数的实现原理及性能分析(二)
15百度工程师讲PHP函数的实现原理及性能分析(一)
16php以fastCGI的方式运行时文件系统权限问题及解决方法
17PHP中的Streams详细介绍
18PHP SPL标准库之数据结构队列(SplQueue)和优先队列(SplPriorityQueue)
19xss攻击知识入门整理
20PHP SPL标准库之数据结构双链表(SplDoublyLinkedList)
21PHP SPL标准库之数据结构固定长度数组(SplFixedArray)
22php利用反射实现插件机制的方法
23php压缩和解压缩字符串的方法
24PHP自带Session隐患(session文件独占锁引起阻塞)
25Cookie与Session的区别-总结很好的文章
26推荐给开发者的11个PHP框架
27xhprof安装&&使用
28PHP多线程之内部多线程实例分析
29PHP使用QPM实现多进程并行任务处理程序
30PHP多进程处理并行处理任务实例
31PHP多线程编程之管道通信实例分析
32PHP守护进程实例
33php查询mysql大量数据造成内存不足的解决方法
34PHP异常处理
35php开启多进程的方法
36HHVM 是如何提升 PHP 性能的?
37PHP开发者应了解的24个超酷的PHP库(微框架)
38php使用iconv中文截断问题的解决方法
39nginx下支持PATH_INFO详解
40PHP实现的带超时功能get_headers函数
41PHP中实现获取IP和地理位置类分享
42 XDebug を使用して PHP プログラムを分析し、パフォーマンスのボトルネックを見つける
43 PHP 開発者が知っておくべき 5 つの Composer ヒント
44 PHP でセッションを使用してユーザーがバックエンドに不正にログインできないようにする方法
45 PHP 依存関係管理ツール Composer 入門チュートリアル
46PHP は閲覧履歴ページの URL を Cookie に保存するメソッドを実装します
47imagick を使用して PHP で PSD ファイルのサムネイルを生成するチュートリアル
48 QQ 関連の PHP コードに関する Friends Network (QQ の学習に最適な情報)
49 PHP の使い方コールバック関数と注意事項
50PHP セッションは同時実行の問題を引き起こす可能性があります
51smarty カスタム関数 htmlcheckboxes の使用例
52 中央気象台全国天気予報コード例よりphpを収集
53 セッションの仕組みとセッションの関連アプリケーションの詳細説明