hysryt / wiki

https://hysryt.github.io/wiki/
0 stars 0 forks source link

Xdebug #91

Open hysryt opened 5 years ago

hysryt commented 5 years ago

https://xdebug.org

hysryt commented 5 years ago

php.ini での設定項目一覧

xdebug.auto_trace

型:boolean、初期値:0

これを有効化すると、スクリプトが動作する前に関数呼び出しのトレースを開始する。これによって auto_prepend_file 内のコードもトレース可能となる。

xdebug.cli-color

型:Integer、初期値:0、Xdebug 2.2 から使用可能

1 に設定すると、tty かつ CLI モード時に var_dump とスタックトレースを色付けして出力する。Windows の場合は ANSICON ツールが必要。

2 に設定すると、常に var_dump とスタックトレースを色付けして出力する。エスケープコードが出力されるかもしれない。

詳しくはこちらの記事を参照。

xdebug.collect_assignments

型:boolean、初期値:0、Xdebug 2.1 から使用可能

1 にすると関数トレース時に変数の変更を追加する。(自信ない)

Xdebug 2.6 からは assign-by-var(&=) も含める。

xdebug.collect_includes

型:boolean、初期値:1

include(), include_once(), require(), require_once() に使用されたファイル名をトレースファイルに含めるかどうか。

xdebug.collect_params

型:Integer、初期値:0

関数呼び出し時に渡された引数を関数呼び出しトレースやスタックトレースで収集するかどうか。

大きなスクリプトの場合は多くのメモリを使用するため、動作が不可能になることを防ぐように初期値は 0 になっている。安全に使用することができるが、多くの関数呼び出しや巨大なデータ構造を引数とするスクリプトでは問題が発生する可能性がある。Xdebug 2 ではこれらの情報をメモリに格納しないため、この問題は発生しない。代わりにディスクに格納するため、ディスクの使用状況を監視する必要はある。

設定可能な値は以下の通り。こちらでデモをみることが出来る。

設定値 表示形式
0 無効
1 型と要素数(例:string(6), array(8))
2 型と要素数と詳細を表示するツールチップ
3 完全な変数の内容(xdebug.var_display_max_children、xdebug.var_display_max_data、 xdebug.var_display_max_depthで制御可能)
4 完全な変数の内容と変数名
5 PHP でシリアライズされた変数の内容。変数名は除く。(Xdebug 2.3 から使用可能)

xdebug.collect_return

型:boolean、初期値:0

トレースファイルに変数の返り値を出力するかどうか。

xdebug.trace_format が 1 の場合、Xdebug 2.3 以降でのみ動作する。

xdebug.collect_vars

型:boolean、初期値:0

関数内でどの変数が使われているかという情報を収集する。これはPHPのオペコード配列をリバースエンジニアリングする必要があるため、かなり遅くなる可能性がある。変数の中身は記録されない。xdebug_get_declared_vars() を使いたい場合のみ有効化すればいい。

xdebug.coverage_enable

型:boolean、初期値:1、Xdebug 2.2 から使用可能

0 に設定すると、コードガバレッジのためのセットアップが行われなくなる。かなり高速化するが、もちろん Code Coverage Analysis は動作しなくなる。

xdebug.default_enable

型:boolean、初期値:1

1 に設定すると、スタックトレースがデフォルトでエラーイベントに表示される。xdebug_disable() でスタックトレースの表示を無効化できる。これは Xdebug の基本機能の一つであり、設定を 1 のままにすることを推奨する。

xdebug.dump.*

型:string、初期値:空文字

* には COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION が入る。これら7つの設定はエラー発生時にスーパーグローバル変数からのデータの表示をコントロールする。

コンマ区切り、または * で設定する。スペースを含めてはならない。

エラー発生時に REMOTE_ADDR と REQUEST_METHOD と全ての GET パラメータをダンプする場合は以下のように設定する。

xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump.GET = *

xdebug.dump_globals

型:boolean、初期値:1

true に設定すると、xdebug.dump.* で指定したスーパーグローバル変数の値を画面上のスタックトレースとエラーログに出力する。

xdebug.dump_once

型:boolean、初期値:1

0に設定すると全てのエラーで、1に設定すると最初のエラーのみスーパーグローバル変数の値を出力する。

xdebug.dump_undefined

型:boolean、初期値:0

スーパーグローバル変数の undefined を出力する場合は 1 を設定する。

xdebug.extended_info

型:Integer、初期値:1

PHPパーサに extended_info モードを強制するかどうか。これによってリモートデバッガでファイルまたは行でのブレークポイントを設定できる。オフにするとスクリプトサイズが小さくなる。スクリプト内で init_set() を使って設定することはできない。php.ini で設定する必要がある。

xdebug.file_link_format

型:string、初期値:空文字、Xdebug 2.1 から使用可能

スタックトレース内のリンク文字列のフォーマットを指定する。これにより、IDEは、Xdebugがスタックトレースで表示するファイル名をクリックすることによって、行とファイルに直接行くことを可能にするリンクプロトコルを設定することができる。例えば以下の通り

myide://%f@%l

可能な書式指定子は次のとおり。

書式指定子 意味
%f ファイル名
%l 行番号

さまざまなIDE / OSには、この作業を行う方法に関するいくつかの指示がある。

xdebug.filename_format

型:string、初期値:...%s%n、Xdebug 2.6 から使用可能

xdebug_var_dump() の結果やHTMLスタックトレース内のファイル名のフォーマットを指定する。

可能な書式指定子は以下の通り。出力例のフルパスは /var/www/vendor/mail/transport/mta.php

指定子 意味 出力例
%a 2つのディレクトリ要素とファイル名 mail/transport/mta.php
%f フルパス /var/www/vendor/mail/transport/mta.php
%n ファイル名のみ mta.php
%p 1つのディレクトリ要素とファイル名 transport/mta.php
%s ディレクトリセパレータ Linux、macOS の場合は \、Windows の場合は/

xdebug.force_display_erros

型:boolean、初期値:0、Xdebug 2.3 から使用可能

1 に設定した場合、PHP のdisplay_errors にかかわらずエラーを常に出力する。

xdebug.force_error_reporting

型:Integer、初期値:0、Xdebug 2.3 から使用可能

error_reporting と同じようにビットマスクで設定する。この設定は php.init でのみ行うことができ、スクリプト内での ini_set() を使った設定を無視する。

xdebug.halt_level

型:Integer、初期値:0、Xdebug 2.3 から使用可能

Notice や Worning をエラーとするかどうかを設定する。PHPによる Notice と Worning に加え、trigger_error() によって自分で生成した Notice と Worning が設定対象となる。例えば strlen() に引数を与えない場合 Worning となるが、これをエラーとする場合は以下の様にする。

ini_set('xdebug.halt_level', E_WARNING);
strlen();
echo "Hi!\n";

これによってエラーメッセージが表示され、スクリプトは中断する。echo "Hi!\n"; は実行されない。

この設定はビットマスクで行う。全ての Notice と Worning をエラーにする場合は以下の様にする。

xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE

ビットマスクの上記の4つのレベルのみサポートする。

xdebug.idekey

型:string、初期値:以下の説明を参照

Xdebug が DBGp デバッガハンドラに渡す IDE キーを設定する。初期値は環境設定によって左右され、DBGP_IDEKEY、USER、USERNAME の順に参照して設定されている値が使用される。いずれも設定されていない場合は空文字となる。この設定に値が設定されている場合はその値が最優先となる。

xdebug.manual_url

型:string、初期値:http://www.php.net、Xdebug 2.2.1 から使用可能

関数トレースやエラーメッセージの中のマニュアルページへのリンクに使われるベースURL。もっとも近いミラーに設定することを推奨する。

xdebug.max_nesting_level

型:Integer、初期値:256

無限再帰から保護するための設定。ネスト関数の最大レベルを設定する。この値を超えた場合 Error 例外となる。

Xdebug 2.6 より前はこの値を超えた場合致命的な例外が発生する。

Xdebug 2.3 より前は初期値が 100。

xdebug.max_stack_frames

型:Integer、初期値:-1、Xdebug 2.3 から使用可能

スタックトレースに表示されるスタックフレームの数を設定する。コマンドラインとHTML両方に適用される。

xdebug.overload_var_dump

型:Integer、初期値:2、Xdebug 2.1 より後から使用可能

デフォルトでは php.ini の html_errors が 1 か 2 の場合、Xdebug は var_dump() を独自で改良したバージョンでオーバーロードする。これを無効にしたい場合はこの設定を 0 にすれば良いが、html_errors の方を変えたほうがよい場合もある。

Xdebug 2.3 からは 2 に設定すると var_dump() の結果がより見やすくなり、ファイル名や行番号なども出力される。xdebug.file_link_format の設定も反映される。

Xdebug 2.4 より前は初期値が 1 。

xdebug.profiler_aggregate

型:boolean、初期値:0

1 を設定した場合、複数のリクエストが一つのプロファイラーファイルに書き出される。複数のリクエストの平均を見ることができる。ファイル名は cachegrind.aggregate。別の集計を取りたい場合は先にこのファイルを移動させる必要がある。

xdebug.profiler_append

型:boolean、初期値:0

1 を設定した場合、プロファイラーファイルを上書きせず、後に付け足しで記述されていく。ファイル名は xdebug.profiler_output_name に依存する。

xdebug.profiler_enable

型:boolean、初期値:0

プロファイラを有効化し、profile output directory にファイルを生成する。ファイルは KCacheGrind で読み込んで可視化することができる。この設定はスクリプト内から ini_set() を使って変更することはできない。部分的にプロファイラを有効化したい場合はこの設定ではなく xdebug.profiler_enable_trigger を使用する。

xdebug.profiler_enable_trigger

型:boolean、初期値:0

この設定は 1 にした場合、GET/POST パラメータの XDEBUG_PROFILE、または Cookie のXDEBUG_PROFILE を使用してプロファイラーファイルの生成をトリガすることができる。プロファイラーファイルは xdebug.profiler_output_dir で指定したディレクトリに保存される。各リクエストでプロファイラファイルを生成したくない場合は xdebug.profiler_enable を 0 に設定する。トリガー自体へのアクセスは xdebug.profiler_enable_trigger_value で設定できる。

xdebug.profiler_enable_trigger_value

型:string、初期値:空文字、Xdebug 2.3 から使用可能

xdebug.profiler_enable_trigger で説明する XDEBUG_PROFILE 機能を使用できるユーザを制限するための設定項目。空文字以外に設定した場合、GET/POST/Cookie にここで設定した値を設定した時のみ プロファイラが開始される。

xdebug.profiler_output_dir

型:string、初期値:/tmp

プロファイラが出力するディレクトリ。PHPを走らせるユーザに書き込み権限があることを確認すること。スクリプト内の ini_set() から設定を変更することはできない。

xdebug.profiler_output_name

型:string、cachegrind.out.%p

トレースをダンプするために使用するファイル名を設定する。書式指定子を使い、sprintf() や strftime() と同じように設定する。使用できる書式指定子については xdebug.trace_output_name を参照。

xdebug.remote_addr_header

型:string、初期値:空文字、Xdebug 2.4 から使用可能

コネクトバックに使用するIPアドレスまたはホスト名が格納された $_SERVER スーパーグローバル変数のキーを設定する。xdebug.remote_connect_back と共に使用する必要がある。

xdebug.remote_autostart

型:boolean、初期値:0

通常はリモートデバッギングを開始する場合は特定の GET/POST パラメータが必要となるが、この設定を 1 に設定した場合、Xdebug は常にリモートデバッギングを開始し、クライアントへの接続を試行する。

xdebug.remote_connect_back

型:boolean、初期値:0、Xdebug 2.1 から使用可能

これを設定すると xdebug.remote_host の設定は無視され、HTTPリクエストを送信したクライアントへ接続を試行する。内部的には $_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['REMOTE_ADDR'] から IP アドレスを取得している。

xdebug.remote_addr_header を設定している場合は $_SERVER['HTTP_X_FORWARDED_FOR'] と $_SERVER['REMOTE_ADDR'] の前に確認を行う。

この設定は CLI には適用されない。

Web サーバに接続した全てのクライアントがリモートデバッギングを開始できることに注意すること。

xdebug.remote_cookie_expire_time

型:Integer、初期値:3600、Xdebug 2.1 から使用可能

リモートデバッギングのセッション時間を設定する。

xdebug.remote_enable

型:boolean、初期値:0

Xdebug がリモートのデバッグクライアントに接続を試行するかどうかを設定する。接続できなかった場合は 0 を指定した時と同じように動作する。

xdebug.remote_handler

型:string、初期値:dbgp

古い PHP 3 Styledebugger 出力である php3 、デバッガインタフェースのようなGDBを有効にする 'gdb'、またはデバッガプロトコルである 'dbgp'のいずれかを設定する。

注意:Xdebug 2.1 からは dbgp のみサポートしている。

xdebug.remote_host

型:string、初期値:localhost

デバッグクライアントが動作しているホストを指定する。ホスト名、IPアドレス、Unixドメインソケットのいずれか。xdebug.remote_connect_back が設定されている場合は無効。

Unixドメインソケットのサポートは Xdebug 2.6 から開始。

xdebug.remote_log

型:string、初期値:空文字

リモートデバッガーとの通信を記録するファイル名を指定する。ファイルは常に追記モードで開かれ、デフォルトでは上書きされることはない。同時実行時の動作を保証しない。ファイルのフォーマットは以下の通り。

Log opened at 2007-05-27 14:28:15
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init>

<- step_into -i 1
-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response>

xdebug.remote_mode

型:string、初期値:req

デバッグコネクションをいつ初期化するかを指定する。設定できる値は以下の2つ。

xdebug.remote_port

型:Integer、初期値:9000

デバッグクライアント側のポート番号。多くのクライアントがこのポート番号を使用するため、変更しないことを推奨する。

xdebug.remote_timeout

型:Integer、初期値:200、Xdebug 2.6 から使用可能

Xdebug が IDE から応答を待機する時間をミリ秒で設定する。多くの場合デフォルトの200msで十分。ネットワークが遅い場合などはこの値を大きくする必要がある。

xdebug.scream

型:boolean、初期値:0、Xdebug 2.1 から使用可能

1 を設定した場合、スクリプト内の @ を無視し、Notice、Worning、Error を表示する。

xdebug.show_error_trace

型:Integer、初期値:0、Xdebug 2.4 から使用可能

1 を設定した場合、Error をキャッチした場合でもスタックトレースを表示する。

xdebug.show_exception_trace

型:Integer、初期値:0

1 を設定した場合、Error や 例外をキャッチした場合でもスタックトレースを表示する。

Error例外は PHP 7 から使用可能。

xdebug.show_local_vars

型:Integer、初期値:0

0 以外に設定された場合、エラー時 Xdebug が生成したスタックをダンプし、全ての変数を表示する。多くの情報が出力されるため、デフォルトでは無効となっている。

xdebug.show_mem_delta

型:Integer、初期値:0

0 以外に設定した場合、関数呼び出し間のメモリの使用を人間が読めるトレースファイルに表示する。Xdebug がコンピュータの読めるトレースファイルを生成するよう設定されている場合はこの情報は常に表示される。

xdebug.trace_enable_trigger

型:boolean、初期値:0、Xdebug 2.2 から使用可能

1 に設定した場合、トレースファイルの生成を XDEBUG_TRACE GET/POST パラメータまたは XDEBUG_TRACE cookie でトリガーできる。ファイルは xdebug.trace_output_dir で指定したディレクトリに保存される。リクエストごとにファイル生成するのを防ぐために、 xdebug.auto_trace を 0 に設定する必要がある。トリガー自体へのアクセスは xdebug.trace_enable_trigger_value で設定する。

xdebug.trace_enable_trigger_value

型:string、初期値:空文字、Xdebug 2.3 から使用可能

xdebug.trace_enable_trigger で説明した XDEBUG_TRACE 機能の使用を制限するために使用する。空文字から変更した場合、cookie、GET、POST の値はその値にする必要がある。

xdebug.trace_format

型:Integer、初期値:0

トレースファイルのフォーマットを指定する。

説明
0 人間の読めるトレースファイル。時間、メモリ使用量、メモリ差異(xdebug.show_mem_deltaが有効な場合)、レベル、関数名、関数の引数(xdebug.collect_params が有効な場合)、ファイル名、行番号
1 コンピュータ用のトレースファイル。レコードタイプを2つもつ。entry 時のスタックフレームと exit 時のスタックフレーム。次のリストが各レコードタイプのフィールドを表す。各フィールドはタブで区切られる。
2 HTML

コンピュータ用のフォーマット

Record type 1 2 3 4 5 6 7 8 9 10 11 12 - ...
Entry level function # 常に0 時間 メモリ使用量 関数名 ※1 include/require のファイル名 ファイル名 行番号 引数の数 引数
Exit レベル function # 常に1 時間 メモリ使用量 あとは空
Return レベル function # 常にR 返り値 あとは空

※1 ・・・ ユーザ定義関数の場合は 1、内部関数の場合は 0

例は Function Traces を参照。

xdebug.trace_options

型:Integer、初期値:0

1 を設定した場合、トレースファイルを上書きではなく追記する。

xdebug.trace_output_dir

型:string、初期値:/tmp

トレースファイルの保存先。PHPの実行ユーザに書き込み権限があることを確認すること。

xdebug.trace_output_name

型:string、初期値:trace.%c

トレースをダンプするファイル名にしようする。sprintf() や strftime() のような書式指定子で指定する。ファイル名にはいくつかの書式指定子が使用可能。拡張子として .xt が自動的に追加される。

使用可能な書式指定子は以下の通り。

| 書式指定子 | 意味 | 例 | 例の結果 | | %c | 現在のディレクトリのCRC32 | trace.%c | trace.1258863198.xt | | %p | pid | trace.%p | trace.5174.xt | | %r | 乱数 | trace.%r | trace072db0.xt | | %s | スクリプト名 | cachegrind.out.%s | cachegrind.out._home_httpd_html_test_xdebug_test_php.xt | | %t | タイムスタンプ(秒) | trace.%t | trace.1179434742.xt | | %u | タイムスタンプ(ミリ秒)| trace.%u | trace.1179434749_642382.xt | | %H | $_SERVER['HTTP_HOST'] | trace.%H | trace.kossu.xt | | %R | $_SERVER['REQUEST_URI'] | trace.%R | trace._test_xdebug_test_php_var=1_var2=2.xt | | %U | $_SERVER['UNIQUE_ID'] | trace.%U | trace.TRX4n38AAAEAAB9gBFkAAAAB.xt | | %S | セッションID | trace.%S | trace.c70c1ec2375af58f74b390bbdd2a679d.xt | | %% | % | trace.%% | trace.%.xt |

xdebug.var_display_max_children

型:Integer、初期値:128

表示する配列の子要素およびオブジェクトのプロパティの最大数。xdebug_var_dump()、xdebug.show_local_vars、Function Tracesで使用される。

制限をなくす場合は -1 を指定する。

この設定はリモートに送信する要素数には影響しない。

xdebug.var_display_max_data

型:Integer、初期値:512 xdebug_var_dump()、xdebug.show_local_vars、Function Tracesで表示する文字列の最大長。

制限をなくす場合は -1 を指定する。

この設定はリモートに送信する要素数には影響しない。

xdebug.var_display_max_depth

型:Integer、初期値:3

xdebug_var_dump()、xdebug.show_local_vars、Function Tracesで表示する配列やオブジェクトのネストレベル。

最大値は 1023。制限をなくす場合は -1 を指定する。

この設定はリモートに送信する要素数には影響しない。

hysryt commented 5 years ago

基本機能

https://xdebug.org/docs/basic

string xdebug_call_class( [int $depth = 2] )

string xdebug_call_file( [int $depth = 2] )

string xdebug_call_function( [int $depth = 2] )

int xdebug_call_line( [int $depth = 2] )

スタックトレースの中から指定の深さの関数情報を取得する。 引数が 0 ならスタックトレースの一番上の、1 なら上から2つめの関数情報を取得する。 取得できる情報は、クラス名、ファイル名、関数名、行番号。 引数の $depth の初期値は公式ドキュメントでは 1 となっているがおそらく 2 の間違い。

<?php

class ClassA {
  function funcA() {
    echo xdebug_call_class(), '<br>';
    echo xdebug_call_file(), '<br>';
    echo xdebug_call_function(), '<br>';
    echo xdebug_call_line(), '<br>';
  }
}

class ClassB {
  function funcB() {
    $classA = new ClassA();
    $classA->funcA();
  }
}

$classB = new ClassB();
$classB->funcB();

この場合、funcA()ClassBfuncB() から呼び出されているため、結果は以下のようになる。

ClassB
/var/www/html/index.php
funcB
20

ある関数がどこから呼び出されているかを特定するのに役立つ。 スタックトレース的にこんな感じになっていると思われる。

[0] xdebug_call_class()
[1] ClassA::funcA()
[2] ClassB::funcB()  <- 初期値

void xdebug_disable()

エラー時のスタックトレースの表示を無効化する。

void xdebug_enable()

エラー時のスタックトレースの表示を有効化する。