xdebugを使用したPHPアプリケーションのトレース

xdebugストーリーの2番目のエピソードへようこそ。 xdebugのインストールとその基本機能については、最初のシリーズで説明しました。 この記事では、プログラムのトレースを見ていきます。

xdebugシリーズの紹介



トレースログの作成



デバッグ情報を出力するためのさまざまな関数を手動で追加する代わりに、xdebugを使用してトレースログを作成できます。 トレースログは、スクリプトの実行中のクラス関数とメソッドの呼び出しのリストです。 利点は、各呼び出しがログに反映されることです

トレースログは、要求ごとに異なる着信データに依存するため、通常は開始ごとに異なります。

トレースログを追跡すると、プログラムの実行方法を理解するのに役立ちますが、プログラムが非常に単純でない限り、可能なすべてのブランチを視覚化することは非常に困難です。 1つは、プログラムを開発する2つの可能な方法を意味します。 さらに各ifで、(理論的に)可能な開発パスの数に2を掛けます。このため、大きなプログラムのテストは非常に困難です。異なる開発パスが多すぎるため、それぞれをテストする必要があります。

それでは、トレースログの作成を始めましょう。 xdebugは、ログに対して2つの異なる形式をサポートしています。 デフォルトでは、ロジックは人間の目に心地よい形式で作成され、読みやすく分析しやすいです。 (xdebugログを処理するように設計された)何らかのプログラムでトレースログを処理する場合は、xdebugを別の形式で構成する必要があります。 この形式(コンピューター可読)は、固定長の列が含まれているため、プログラム(ログアナライザー)で簡単に処理できます。

実行する各スクリプトのトレースログを取得する場合は、次のコマンドを追加します

xdebug.auto_trace =オン

xdebug.trace_output_dir = c:\ data


php.iniで。 php.iniを変更した後は、忘れずにWebサーバーを再起動してください。

2行目は、xdebugがログを保存するパスを定義します。 デフォルトでは、このパスは/ tmpに設定されており、適切な選択ですが、c:\ tmp(c:は現在のドライブであると考えられます)は通常作成されないため、Windowsで問題が発生します。 したがって、xdebugがトレースログを保存するディレクトリをWindowsに作成する(または既存のディレクトリを登録する)必要があります。そうしないと、何も機能しません。

関数とメソッドの実行は、それらへの各呼び出しと結果が記録されるため、非常に遅くなります。



アプリケーションパーツトレース



トレースログのサイズは非常に急速に増大するため、初期化段階でトレースログを作成するなど、アプリケーションの「重要な」部分のみのログを作成することをお勧めします。

小さな再帰関数(階乗計算)のトレースログを作成する方法を見てみましょう。この例では、リアルタイムでトレースを開始および終了します。 php.iniでトレースをアクティブにした場合、スクリプトのトレースが既に開始されているという警告が表示されます。

xdebug_start_trace( 'c:/data/fac.xt');

プリントfac(7);



関数fac($ x)

{

if(0 == $ x)1を返します;

return $ x * fac($ x-1);

}



xdebug_stop_trace();


パスとファイル名でわかるように、プログラムはWindowsで実行されています。 Unixを実行している場合は、別のファイル名を使用する必要があります。 xdebug_start_trace関数はトレースの記録を開始し、xdebug_stop_traceは停止します。 このコードが起動されると、およそ次のログファイルが生成されます。

トレース開始[2007-10-26 12:18:48]

0.0068 53384-> fac()C:\ www \ fac.php:5

0.0069 53584-> fac()C:\ www \ fac.php:10

0.0069 53840-> fac()C:\ www \ fac.php:10

0.0070 54096-> fac()C:\ www \ fac.php:10

0.0070 54376-> fac()C:\ www \ fac.php:10

0.0071 54656-> fac()C:\ www \ fac.php:10

0.0072 54936-> fac()C:\ www \ fac.php:10

0.0072 55216-> fac()C:\ www \ fac.php:10

0.0073 55392-> xdebug_stop_trace()C:\ www \ fac.php:13

0.0237 55392

トレース終了[2007-10-26 12:18:48]


各行の最初の列には、コードが開始された合計時間が表示されます。 2番目の列は、スクリプトが現在使用しているメモリの量を示しています。 最後の列には、ファイル、行、および関数名が表示されます。 xdebugは、読みやすくするために、呼び出しスタックに従って各関数をインデントします。

xdebugでメモリ使用量の違いを表示する場合は、追加します

xdebug.show_mem_delta =オン


php.iniで。 違いは、現在の行と前の行のメモリ使用量の違いです。 実行時にini_set関数を使用してこの設定を追加できますが、トレースが開始された後でなければなりません。

xdebug_start_trace関数には、2番目のオプションのパラメーターがあります。 次の3つの設定の1つ以上を使用できます。XDEBUG_TRACE_APPENDは既存のトレースファイルに追加します。 XDEBUG_TRACE_COMPUTERIZEDが設定されている場合、xdebugはパーサーが読みやすい形式でトレースログを作成します。 このパラメーターの使用は、xdebug.trace_formatパラメーターを1に設定することと同じです。XDEBUG_TRACE_HTMLパラメーターは、トレースログの形式をHTMLとして設定します。

次のスクリーンショットは、トレースログのHTML形式を示しています。





トレースログへの情報の追加



関数に渡すパラメーターを保存するようにxdebugを構成することもできます。 これは、プログラムの実行方法をよりよく理解するのに非常に役立ちます。

トレースログへのパラメーターの保存は、前の記事で説明したxdebug.collect_paramsパラメーターによって設定されます。 xdebug.collect_paramsは数値を受け入れます。0は追加情報がないことを意味し、4は変数の名前と関数の各パラメーターに関するすべての情報を表示する必要があることを意味します。 値3は、前の記事で説明したxdebug.var_display_max_data、debug.var_display_max_childrenおよびxdebug.var_display_max_depthパラメーターの設定に従ってトリミングされた変数の名前と値を表示します。

以下は、関数パラメータを保存したトレースログからの抜粋です。



0.0033 54320-> fac($ x = 7)C:\ www \ fac.php:6

0.0034 54432-> fac($ x = 6)C:\ www \ fac.php:11



さらに情報を追加しましょう。 を使用して

xdebug.collect_return =オン


各関数の戻り値を保存するようにxdebugを構成します。 これにより、ログが少し読みにくくなりますが、関数のログを見ると、再帰の各段階で返される値がわかります。

トレース開始[2007-10-26 12:30:04]

0.0133 55704 +48-> fac($ x = 7)C:\ www \ fac.php:8

0.0133 55840 +136-> fac($ x = 6)C:\ www \ fac.php:13

0.0134 56096 +256-> fac($ x = 5)C:\ www \ fac.php:13

0.0134 56352 +256-> fac($ x = 4)C:\ www \ fac.php:13

0.0134 56632 +280-> fac($ x = 3)C:\ www \ fac.php:13

0.0135 56912 +280-> fac($ x = 2)C:\ www \ fac.php:13

0.0135 57192 +280-> fac($ x = 1)C:\ www \ fac.php:13

0.0135 57472 +280-> fac($ x = 0)C:\ www \ fac.php:13

> => 1

> => 1

> => 2

> => 6

> => 24

> => 120

> => 720

> => 5040

0.0140 57648 +176-> xdebug_stop_trace()C:\ www \ fac.php:26

0.0140 57648

トレース終了[2007-10-26 12:30:04]


この例でわかるように、xdebug.show_mem_deltaパラメーターが設定されています。



トレースログヘッダー



これまで、トレースログの名前を明示的に示しました。 これは必ずしも便利ではありません。 入力データまたはアプリケーションの状態に応じてログを考慮する必要がある場合、xdebug自体が自動的に名前を割り当てると便利です。 xdebugは、使用する内容に応じて、xdebug.auto_traceパラメーターまたはxdebug_start_trace()関数を使用してトレースをアクティブにする名前を割り当てる場合があります。 最後の例でxdebug_start_trace関数のパラメーターとして空の引数を渡すと、xdebugはファイルの名前を自動的に選択します。

生成されたxdebugファイルの名前は常に「trace」で始まり、拡張子は.xtです。 デフォルトポイント間の名前の部分は、作業ディレクトリからのCRCです。 xdebug.trace_output_nameを設定すると、トレースログに別の名前を定義できます。 xdebug.trace_output_nameは引数として文字列を取ります。文字列にはさまざまな修飾子を含めることができます。 以下は、最も重要な修飾子のリストです。

指定された修飾子の巧妙な組み合わせを使用して、xdebugに異なる数のトレースログを作成させ、仮想ホストまたは要求の名前に応じてどのログがどのシナリオに属するかを理解させることができます。

ほとんどの場合、1回の実行でスクリプトを作成する必要があります。 したがって、xdebugは既存のログを指定された名前で上書きします。 次の設定を使用して、現在の情報を追加するようにxdebugを構成できます

xdebug.trace_options = 1


php.iniで。

起動時にxdebugがログの書き込みに選択する名前を知る必要がある場合は、xdebug_get_tracefile_name()関数を呼び出すことができます。



おわりに



関数トレースを使用する機能は、xdebugが提供する非常に便利な機能です。 さまざまな関数への呼び出しを追加せずに、プログラムのロジックを作成できます。 すべての関数呼び出しは、ヘルプ関数表示関数への明示的な呼び出しなしで表示されます。

grepなどのさまざまなユーティリティを使用して、必要な情報やトレースログのセクションを検索したり、このファイルを解析する小さなPHPプログラムを作成したりできます。 トレースは、デバッガーに代わるものではありません。 デバッガーについては、ストーリーの第4部で説明します。

軍用車両でトレースを有効にする必要はありません。これにより、パフォーマンスが大幅に低下し、プログラムの各行がトレースログに反映されます。

次の記事では、xdebugを使用したPHPアプリケーションのプロファイリングについて説明します。



All Articles