xdebug は PHP 開発者にとって便利すぎる

WBOY
リリース: 2016-06-13 13:03:11
オリジナル
1239 人が閲覧しました

xdebug は PHP 開発者にとって便利すぎます。

この記事は IBM 開発者によるものです。

?

PHP を使用してシステム管理や従来のデータ処理などのタスク用のコマンドライン スクリプトを作成できますが、プログラミング言語は Web アプリケーションのパフォーマンスに大きな影響を与えます。使用中、各 PHP アプリケーションはサーバー上に常駐し、受信リクエストを処理するためにプロキシ (Apache など) 経由で呼び出されます。一般的な PHP Web アプリケーションは、リクエストごとに、短い実行後に Web ページまたは XML データ構造を取得します。

単純な実行では、クライアント、ネットワーク、HTTP サーバー、アプリケーション コード、基礎となるデータベースを含む階層的に構築された Web アプリケーションでは、PHP コード内のエラーを切り分けることが困難になります。 PHP コードを除くすべてのレイヤーが適切に機能していると仮定しても、特にアプリケーションが多数のクラスを使用している場合、PHP コードのバグを追跡することは非常に困難になる可能性があります。

PHP ステートメントの echo と関数 var_dump()、debug_zval_dump()、および print_r() は、さまざまな問題の解決に役立つ一般的なデバッグ支援ツールです。ただし、これらのステートメント、および PEAR Log パッケージなどのさらに強力なツールは、証拠を生成するためにコンテキストの外で推測的に分析する必要があるフォレンジック ツールです。

推論によるデバッグは、ある程度無謀です。データを収集して精査し、何が問題だったのかを推測します。重要な情報が欠落している場合は、コードを再テストし、手順を繰り返し、調査を再度開始する必要があります。より効率的なアプローチは、アプリケーションの実行中にプローブすることです。リクエスト パラメーターを並べ替えたり、プロシージャ コール スタックをフィルターしたり、必要な変数やオブジェクトをクエリしたりできます。アプリケーションを一時的に中断し、変数の値が変更されたときにアラートを受け取ることができます。場合によっては、「もしも?」という質問を対話的に行うことで、実際に変数に影響を与えることができます。

デバッガと呼ばれる特別なアプリケーションは、この「リアルタイム」つまり対話型の検査をサポートします。プロセスを制御し、そのメモリを監視するために、デバッガを起動してプロセスに接続することができます。あるいは、インタープリター型言語の場合、デバッガーはコードを直接解釈できます。典型的な最新のグラフィカル デバッガは、コードのインデックス付けと参照を行い、複雑なデータ構造を人間が判読できる形式で簡単に表示し、同時にコール スタック、中間出力、すべての変数の値などのプログラムの状態を表示できます。たとえば、デバッガは通常、クラスのプロパティとメソッドを分類して説明します。

今回と次回の記事では、PHP のデバッグを容易にするツールを紹介します。次回は、対話型デバッグと Zend Debugger (PHP 専用の堅牢なデバッガー) に焦点を当て、それが提供する多くの機能を探っていきます。 (Zend Debugger は商用製品であり、Zend PHP 統合開発環境 (IDE) の一部です)。コードではなくビールにお金を費やさないように、オープンソースの PHP デバッガも紹介します。ただし、この記事では、証拠をより効果的に収集する方法に焦点を当てます。

CSI と同様に、さらに迷惑なだけです

コードがエラーを起こした場合、望ましい結果が得られなかった場合、または完全にクラッシュした場合は、「どこで、何を、なぜ、いつ」という 4 つの質問に答える必要があります。

??? * 「場所」は、アプリケーションが最後に正常に実行されたファイルと行番号です。
??? * 「何」とは、間違いを表すコードです。たとえば、容疑者です。
??? * 「なぜ」がエラーの本質です。おそらく、論理エラーおよび/またはオペレーティング システムとの相互作用によって引き起こされるエラー、またはその両方である可能性があります。
??? * および「when」は、エラーが発生したときのコンテキストです。プログラムが終了する前に何が起こるのでしょうか?すべての犯罪と同様、十分な手がかりを集めることができれば、その手がかりは犯人を見つけるのに役立ちます。

フォレンジック ツールである Xdebug (前の記事で PHP アプリケーションのパフォーマンスを分析するために使用したツール) は、その名前が示すように、プログラムのステータスを示すいくつかの関数を提供し、コマンド システムに追加する必要がある貴重な機能です。高度な研究ツール (「参考文献」を参照)。 Xdebug をインストールすると、(表面上は) 無限再帰を防止し、スタック トレースと関数トレースに関するエラー メッセージを修正し、メモリ割り当てを監視するなどの機能が提供されます。 Xdebug には、実行時エラー診断のためにコードに追加できる一連の関数も含まれています。

たとえば、次のコードは、いくつかの xdebug_...() ステップを使用して callee() 関数をテストし、ファイル名、行番号、呼び出し関数の名前など、呼び出しプログラムの正確な場所を出力します。

リスト 1. callee() 関数をテストする手順

???????????????
??? 関数呼び出し先( $a ) {
??????? echo sprintf("callee() が @ %s に呼び出されました: %s から %s",
???????xdebug_call_file()、
???????xdebug_call_line()、
???????xdebug_call_function()
??????? );
???}

??? $result = callee( "arg" );
?>


このコードは次を生成します:

callee() が @ /var/www/catalog/xd.php を呼び出しました: 10 from {main}


トップに戻る

Xdebug をビルドしてインストールします

Xdebug は、Mac OS X などの UNIX® 系オペレーティング システムのソース コードから簡単に構築できます。Microsoft® Windows® で PHP を使用している場合は、バイナリ Xdebug モジュールの最新の PHP バージョンを Xdebug Web サイトからダウンロードできます (「参考文献」を参照)。

Debian “Sarge” Linux および PHP V4.3.10-19 用の Xdebug をビルドしてインストールしてみましょう。この記事の執筆時点で、Xdebug の最新バージョンは V2.0.0RC4 で、2007 年 5 月 17 日にリリースされました。この記事を続けるには、phpize ユーティリティと php-config ユーティリティが必要で、システムの php.ini 構成ファイルを編集できる必要があります (ユーティリティがない場合は、PHP.net にアクセスしてソース コードと手順を参照してください) PHP をゼロから構築する方法について)。次の手順に従ってください:

?? 1. Xdebug tarball (gzip 圧縮された .tar アーカイブ) をダウンロードします。 wget コマンドを使用すると、これを簡単に行うことができます:

??????$ wget http://www.xdebug.org/files/xdebug-2.0.0RC4.tgz
????????????????????????


?? 2. tarball を解凍し、ソース コード ディレクトリに移動します:

?????$ tar xzf xdebug-2.0.0RC4.tgz
?????$ cd xdebug-2.0.0RC4
????????????????????????


?? 3. phpize を実行して、使用している PHP のバージョン用の Xdebug コードを準備します:

?????$phpize
?????次の設定を行っています:
????? PHP API バージョン: ????? 20020918
???????Zend モジュール API 番号:???20020429
????? Zend 拡張 API 番号:?? 20021010


phpize の出力は、ビルド プロセスの残りの部分を微調整するために使用されるスクリプト (通常は configure という名前) です。
?? 4. 構成スクリプトを実行します:

?????$ ./configure
????? ビルド システム タイプを確認しています... i686-pc-linux-gnu
????? ホスト システムのタイプを確認しています... i686-pc-linux-gnu
????? gcc を確認しています... gcc
????? C コンパイラのデフォルトの出力ファイル名を確認中... a.out
????? C コンパイラが動作するかどうかを確認しています...はい
????? クロスコンパイルしているかどうかを確認しています...いいえ
????? 実行可能ファイルのサフィックスをチェックしています...
????? オブジェクト ファイルのサフィックスをチェックしています... o
????...
????? ライブラリの削除が可能かどうかを確認しています...はい
?????設定タグ「F77」をlibtool
に追加します ????? 構成: ./config.status
を作成しています ????? config.status: config.h


を作成しています ?? 5. make を実行して Xdebug 拡張機能をビルドします:

?????$ 作る
????? /bin/sh /home/strike/tmp/xdebug-2.0.0RC4/libtool
????? --mode=gcc をコンパイルしますか? -I.
????? -I/home/strike/tmp/xdebug-2.0.0RC4 -DPHP_ATOM_INC
????? -I/home/strike/tmp/xdebug-2.0.0RC4/include
????? -I/home/strike/tmp/xdebug-2.0.0RC4/main
????? -I/home/strike/tmp/xdebug-2.0.0RC4
????? -I/usr/include/php4 -I/usr/include/php4/main
????? -I/usr/include/php4/Zend -I/usr/include/php4/TSRM
????? -DHAVE_CONFIG_H? -g -O0 -c
?????/home/strike/tmp/xdebug-2.0.0RC4/xdebug.c -o
????? xdebug.lo mkdir .libs
????...

????? ビルドが完了しました。
????? (tempnam と tmpnam に関する警告は無視しても安全です)。


??????? make を使用すると、Xdebug 拡張機能 xdebug.so が生成されます。
?? 6. 拡張機能をインストールします:

?????$ sudo make install
????? 共有拡張機能のインストール:???? /usr/lib/php4/20020429/


??????? 続行する前に、マウスを使用して、前のコマンドで表示されたディレクトリを選択してコピーします。このパスは、拡張機能を構成する最終ステップで重要です。
?? 7. お気に入りのテキスト エディタで php.ini ファイルを開き、次のコードを追加します:

????? zend_extension = /usr/lib/php4/20020429/xdebug.so
?????xdebug.profiler_enable = オフ
????? xdebug.default_enable = オン


最初の行は Xdebug 拡張機能をロードし、2 行目は Xdebug のプロファイラー機能を無効にし (単純化のため)、3 行目は拡張デバッグ機能を有効にします。

Xdebug 拡張機能がインストールされ有効になっていることを確認するには、Web サーバーを再起動し、コード を使用して単純な 1 行の PHP アプリケーションを作成します。ブラウザで http://localhost/phpinfo.php などのファイルを指定して下にスクロールすると、図 1 のような内容が表示されるはずです。

図 1. Xdebug 拡張機能がインストールされ、実行されていることを確認します
Xdebug 拡張機能が有効になりました

注: phpinfo() の出力に Xdebug セクションが表示されない場合は、Xdebug のロードに失敗しています。 Apache エラー ログに理由がリストされています。一般的なエラーには、zend_extension への間違ったパスや他の拡張機能との競合が含まれます。たとえば、XCache と Xdebug を使用する必要がある場合は、必ず最初に XCache をロードしてください。ただし、Xdebug は開発中に使用することを目的としており、xdebug.so へのパスが正しいことを前提としているため、他の拡張機能を無効にして再試行する必要があります。その後、拡張機能を再度有効にして、キャッシュの影響などの追加のテストを実行できます。 Xdebug サイトには、その他のトラブルシューティングのヒントがいくつかあります。

トップに戻る

Xdebug を構成する

ディレクティブ (図 1 の大きな表の左端の列) は、Xdebug 拡張機能の動作を変更するために設定できるパラメーターです。すべてのディレクティブは php.ini ファイルで設定できます。一部のディレクティブはデバッグ ツールの構成に使用され、他のディレクティブはアナライザーの動作を調整するために使用されます。後者は無視して、PHP コードのデバッグに役立ついくつかの賢明な設定を使用して Xdebug を構成しましょう。

再帰を制限する

アプリケーションが再帰 (フィボナッチ数列の計算など) を使用し、端末環境が正しくない場合、アプリケーションはメモリ不足またはタイムアウトになるまで長時間実行される可能性があります。 xdebug.max_nesting_level パラメーターを設定して、再帰の深さを制限できます。たとえば、xdebug.max_nesting_level = 50 は、アプリケーションを強制的に終了する前に、再帰の深さを 50 のネスト呼び出しに制限します。デモとして、Xdebug を有効にして次のコードを実行します:

リスト 2. 制限された再帰

???????????????
??? 関数 deep_end( ) {
??????? deep_end();
???}
???
??? deep_end();
?>


関数 deep_end() は 1 行ずつ最後まで進みます。 Xdebug が介入し、49 回の関数呼び出し後に図 2 を取得します (ちなみに、main() への最初の呼び出しは、最初の呼び出しとしてプログラムのカウントを開始するために使用されます)。

図 2. 呼び出しスタックが制限を超えた場合、Xdebug は実行を終了します
再帰が多すぎます

アプリケーションが再帰的分離を多用し、より大きな問題を解決する場合は、それに応じて深さを「低く」設定する必要があります。それ以外の場合は、xdebug.max_nesting_level をより小さい値に設定します。これにより、暴走した関数呼び出しシーケンスがより迅速に捕捉されます。

4 つの W の質問に答えてください

間違えた場合は、4 つの W 質問に答える必要があります。 Xdebug は、このすべての情報をすぐに提供します。以下に、いつでも調整できる便利な初期設定を示します。

リスト 3. エラー

???????????????
xdebug.dump_once = オン
xdebug.dump_globals = オン
xdebug.dump_unknown = オン
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.REQUEST=*

xdebug.show_Exception_trace = オン
xdebug.show_local_vars = 1
xdebug.var_display_max_ Depth = 6


xdebug.dump_once、xdebug.dump_globals、xdebug.dump_unknown、および xdebug.dump_SUPERGLOBAL 設定 (ここで、SUPERGLOBAL は COOKIE、FILES、GET、POST、REQUEST、SERVER、または SESSION) は、どの PHP スーパーグローバル変数をすべての診断に含めるかを制御するために使用されます。結果は真ん中。

設定で xdebug.dump_SUPERGLOBAL という名前のスーパーグローバル変数をダンプするには、xdebug.dump_globals を On に設定します。たとえば、xdebug.dump_SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT は、PHP スーパーグローバル変数 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI']、および $_SERVER['HTTP_USER_AGENT'] を出力します。スーパーグローバル配列内のすべての値を出力する必要がある場合は、アスタリスク (*) を使用します (例: xdebug.dump_REQUEST=*)。さらに、xdebug.dump_unknown を On に設定し、指定されたスーパーグローバル変数を設定しない場合、変数は値 unknown で出力されます。

例外がキャッチされた場合でも、行 xdebug.show_Exception_trace = On によって例外のトレースが強制されます。 xdebug.show_local_vars = 1 という行は、まだ初期化されていない変数を含む、各関数呼び出しの最も外側のシェル内のすべてのローカル変数を出力します。 xdebug.var_display_max_ Depth = 6 は、複雑な変数をダンプする深さを意味します。

統合

リスト 4 は、php.ini ファイル内の Xdebug に関連するすべての設定を示しています。

リスト 4. php.ini ファイル

の設定 ???????????????
zend_extension = /usr/lib/php4/20020429/xdebug.so
xdebug.default_enable = オン
xdebug.show_Exception_trace = オン
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_ Depth = 6

xdebug.dump_once = オン
xdebug.dump_globals = オン
xdebug.dump_unknown = オン
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT


これらの設定 (または同様のもの) を php.ini ファイルに保存し、Web サーバーを再起動します。

トップに戻る

ダンプレポートを解釈します

次の例は、エラーが発生したときに何が起こるかを示しています。 「改善すべき」コードをリスト 5 のように変更します。

リスト 5. エラー コードを変更します

???????????????
??? 関数 deep_end( $count ) {
??????? // フレーム数に 1 を加算します
??????? $count += 1;

??????? if ( $count < 48 ) {
??????????????? deep_end( $count );
???????}
??????? 他 {
?????????????trigger_error( "ディープエンドから外れています!" );
???????}
???}

??? // main() が呼び出されてプログラムが開始されます。
??? // したがって、呼び出しスタックは 1 つのフレームから始まります
??? deep_end( 1 );
?>


この新しいコードを実行すると、次のような大量の情報が表示されるはずです:

図 3. エラー
時のスーパーグローバル変数、スタック変数、およびローカル変数のダンプ エラー時のスーパーグローバル、スタック、ローカル変数のダンプ

上部には、trigger_error に渡されるメッセージ テキストが表示されます。下部には、要求された $_SERVER 要素のリストと定義された $_REQUEST 要素のリストがあります。一番下にはスコープ #48 の変数のリストがあり、これはマニフェストに基づく deep_end() の呼び出しです。呼び出しでは、$count は整数 48 です。この Xdebug 構成を適切に設定すると、犯人を追跡するためのより多くの手がかりが得られます。

もう 1 つのヒント: Xdebug は拡張された var_dump() 関数を提供します。これは、PHP 配列およびクラスで特に役立ちます。たとえば、リスト 6 は、単純な (PHP V4) クラスとインスタンスを示しています。

リスト 6. PHP V4 のクラスとインスタンス

???????????????
??? クラス人 {
??????? 変数 $name;
??????? var $姓;
??????? var $age;
??????? var $children = array();

??????? 関数 person( $name, $surname, $age, $children = null) {
??????????$this->name = $name;
??????????$this->surname = $surname;
??????????$this->age = $age;
???????????? foreach ( $children として $child ) {
???????????? $this->children[] = $child;
??????????}
???????}
???}??

??? $boy = 新しい人( 'ジョー', 'スミス', 4 );
??? $girl = 新しい人( 'ジェーン', 'スミス', 6 );
??? $mom = 新しい人( 'メアリー', 'スミス', 34, array( $boy, $girl ) );

??? var_dump( $boy, $mom );
?>


リスト 7 は、var_dump() の出力を示しています。

清单 7. var_dump() 出力

???????????????
物体(人)
? var '名前' =>文字列 'ジョー' (長さ=3)
? var '姓' =>文字列 'Smith' (長さ=5)
? var '年齢' => int 4
? var '子供' =>
???配列
???????空
???????
物体(人)
? var '名前' =>文字列 'メアリー' (長さ=4)
? var '姓' =>文字列 'Smith' (長さ=5)
? var '年齢' => int 34
? var '子供' =>
???配列
??????? 0 =>
???????物体(人)
????????? var '名前' =>文字列 'ジョー' (長さ=3)
????????? var '姓' =>文字列 'Smith' (長さ=5)
????????? var '年齢' => int 4
????????? var '子供' =>
??????????配列
?????????????空
??????? 1 =>
???????物体(人)
????????? var '名前' =>文字列「ジェーン」(長さ=4)
????????? var '姓' =>文字列「スミス」(長さ=5)
????????? var '年齢' => int 6
????????? var '子供' =>
??????????配列
?????????????空


Xdebug と PHP V5 タイプを組み合わせて使用​​する場合、パッケージには public、private、および protected のプロパティが含まれます。 回页首

跟追跡代码

逆に、内部メモリのリークは通常、内部に保存されるまで正常に実行され、その後使用されることになります。プログラムが突然終了する場合、内部メモリの使用量と時間の間に確立されたタイムラインが、正確なタイムラインを示す可能性があり、事前に確認することが困難です。たとえば、関数から関数へと――さらに漏れの原因が指摘されます。 Xdebug は、追跡を実行するための詳細なタイムラインを提供できます。追跡の使用後、Xdebug は、各関数のパラメータと戻り値を含むすべての関数の使用を記録します。读優先的には前者を使用しますが、後者を分析するために独立した特定のアプリケーションを書き込むこともできます。 同様に、Xdebug には、コンテンツを自動的に追跡するために使用されるいくつかの php.ini オプションがあります。たとえば、次の設定により、最新の出力が生成されます。 清单 8. 跟追跡自定义

???????????????
xdebug.trace_format = 0
xdebug.auto_trace = オン
xdebug.trace_output_dir = /tmp/traces
xdebug.trace_output_name =trace.%c.%p

xdebug.collect_params = 4
xdebug.collect_includes = オン
xdebug.collect_return = オン
xdebug.show_mem_delta = オン


さらに、xdebug.auto_trace = 1 を設定すると、すべての PHP スクリプトを実行する前に、xdebug.auto_trace = 0 を設定し、xdebug_start_trace() 関数と xdebug_stop_trace() 関数をそれぞれ使用することもできます。ただしxdebug.auto_trace が 1 の場合、適切な構成の auto_prepend_file を組み込む前に、トレースを開始できます。 ここでは、すべてのファイルが /tmp/traces に保存され、各ファイルは PHP の名前 (すべての Xdebug 追跡ファイルはすべて .xt で終了します。

実際、Xdebug は、時間、内部メモリ使用量、関数名、および関数パラメータを深度フィールドで表示します。さらに、xdebug.show_mem_delta = 1 を指定すると内部メモリ使用量が増加中または減少中であることが確認でき、xdebug.collect_params = 4 を指定した場合は返される各関数の型と値を確認できます。値、xdebug.collect_return = 1 を設定します。

/tmp/traces のリストを作成し、その後 mkdir /tmp/traces を使用します。 chmod a+rwx /tmp/traces のモードは、任意のユーザーによる書き込みが可能なファイル (世界中で読み取り可能) および任意のユーザーによる書き込みが可能なファイル (世界中で書き込み可能) に変更されます。上記の設定を php.ini ファイルに追加し、Web サーバーを再起動し、その後、ブラウザを phpinfo() アプリケーションに再度指示します。全体の手順は図 9 に似ています:

清单 9. 整个跟追跡

???????????????
トレース開始 [2007-06-06 14:04:55]
??? 0.0003?????? 9440? +9440?? -> {メイン}() /var/www/catalog/t/info.php:0
??? 0.0005?????? 9440?????? +0?? -> phpinfo() /var/www/catalog/t/info.php:1
??????????????????????????????? >=->本当
???????????????????????????? >=-> 1
??? 0.2351?????? 9208
トレースエンド?? [2007-06-06 14:04:55]


ここでは、main() は phpinfo() を使用し、後続の関数は TRUE を返します。main() が終了すると 1 が返されます。次に、ブラウザで「最も複雑なコンテンツ」またはシステム上の他の PHP アプリケーションを指定して、より詳細なトレースを生成します。

リスト 10 は、4 番目のフィボナッチ数列を計算するときの、前の記事の PHP フィボナッチ ジェネレーターのトレースを示しています:

リスト 10. PHP フィボナッチ ジェネレーター トレース

???????????????
トレース開始 [2007-06-06 14:17:17]
??? 0.0004?? +16432?? -> /var/www/catalog/t/fibonacci.php:0 ??? 0.0006???? 16696???? -> fib('4') /var/www/catalog/t/fibonacci.php:35 ??? 0.0007?????? 16696?????? +0?????? /var/www/catalog/t/fibonacci.php:7 ??? 0.0007?????? 16736?????? -> fib(2) /var/www/catalog/t/fibonacci.php:7 ??? 0.0007???? 16848 ???? +112????????? -> /var/www/catalog/t/fibonacci.php:7 ?????????????????????????????????????????????>=> 1
??? 0.0008?????? 16904????????? -> fib/www/catalog/t/fibonacci.php:7
?????????????????????????????????????????????>=> 0
???????????????????????????????????????>=> > ??? 0.0009 ????? 16904 ????? -> fib(1) /var/www/catalog/t/fibonacci.php:7 > ???????????????????????????????????????>=> > ?????????????????????????????????>=>2
??? 0.0009?????? +0???? -> /var/www/catalog/t/fibonacci.php:7 ??? 0.0009 ????? 16904 ????? -> fib(1) /var/www/catalog/t/fibonacci.php:7 > ???????????????????????????????????????>=> > ??? 0.0010 ????? 16904 ????? -> fib(0) /var/www/catalog/t/fibonacci.php:7 > ?????????????????????????????????????????????>=> 0
?????????????????????????????????>=>1
?????????????????????????????????>=> 3
??????????????????????????????>=>1
???0.0011???12528
トレース終了?? [2007-06-06 14:17:17]


最初の列は時間を示し、2 列目は累積メモリ使用量、3 列目は増分メモリ使用量、4 列目は引数を含む関数呼び出しを示します。

>=> とマークされた行は、各関数の戻り値を示します (呼び出しとその戻り値を一致させるには、対応するインデント -> を探してください)。なお、最後の>=> 1はmain()の戻り値です。

vim を使用している場合は、Xdebug 作成者 Derick Rethans が、Xdebug トレースに特化した構文強調表示のヒントを提供します。ヒントは、Xdebug ソース パッケージ内の xt.vim ファイルに含まれています。最近の Linux ディストリビューションの場合は、xt.vim を $VIMRUNTIME/syntax/xt.vim にコピーし、vim tracefile.xt を実行するだけです。図 4 は、vim で強調表示されたフィボナッチ トレースを示しています。

図 4. Xdebug によってトレースされた vim 構文ファイルを使用すると、簡単に分析できます
vim で強調表示されたトレース

トップに戻る

結論

PHP コード内のエラーを追跡するのは困難な場合があります。ただし、開発システムがあり、Xdebug をインストールできる場合は、これらのエラーを修正するのがはるかに簡単になります。 Xdebug は、スタック トレースを表示し、複雑な変数もダンプし、メモリ使用量を長期にわたって追跡し、エラーやクラッシュが発生した場合 (発生した場合ではなく、発生した場合) に効果的な事後検証を実行できます。

?

時々、一番上に固定すると良いでしょう。

?

終わりました、美しい女の子を見せましょう。?休憩してください。



?

?

投稿者: cailu

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!