26

この質問への答えをいじくり回しているときに、その中から呼び出されたときに、にdebug_backtrace()登録されている関数を超えてトレースしないことがわかりました。register_shutdown_function()

これは、PHPドキュメントのこのコメントで言及されており、次のように述べています。register_shutdown_function()

致命的なエラーが発生した場所を追跡するために、シャットダウン関数内から debug_backtrace または debug_print_backtrace を呼び出すという考えが浮かぶかもしれません。残念ながら、これらの関数はシャットダウン関数内では機能しません。

もう少し詳しく説明すると、この回答の状態に関するコメント:

うまくいきません。シャットダウン機能は、スタックが巻き戻された後に発生します。ダンプするスタック情報がありません。

これを回避して、プロセスが完全に終了するまで PHP にスタック トレースを強制的に保持させる方法はありますか、それとも PHP の内部構造により、スタック トレースをそのまま受け入れる必要がありますか?

4

5 に答える 5

17

これは非常に高価なソリューションです。register_tick_function()orを使用tickしたことがなく、期待どおりに機能するかどうかはわかりません。

declare(ticks=1);

function tick_handler() {
    global $backtrace;
    $backtrace = debug_backtrace();
}
register_tick_function('tick_handler');



function shutdown() {
    global $backtrace;
    // do check if $backtrace contains a fatal error...
    var_dump($backtrace);
}
register_shutdown_function('shutdown');
于 2011-08-30T10:43:33.337 に答える
9

これを回避して、PHP にスタック トレースを強制的に保持させる方法はありますか

登録された関数が呼び出されると、定義されたすべての関数が返されるか、スタックからクリアされます。

コードが終了した場所を知る必要がある場合は、コードを計測する必要があります。

于 2011-08-30T12:08:50.973 に答える
6

XDebug拡張機能には、xdebug_get_function_stack()関数があります。

これは PHP の internal と同様に機能しますdebug_backtrace()が、シャットダウン ハンドラでもトレースを保持します。

ただし、正確な終了ポイントは取得できません。シャットダウンが発生する前に最後に実行された関数のみが取得されます ( die()/exit()呼び出しまたはエラーによってトリガーされます)。

もちろん、これは開発環境にのみ適しています。

于 2014-10-13T12:14:49.083 に答える
5

私の経験から、シャットダウン関数はクリーンなスタックで開始され、「元の」スタックにはアクセスできません (その時点で存在しないため)。

残念ながら、元のスタックを保存する方法はありません。

于 2011-08-30T10:43:05.993 に答える
0

登録されたシャットダウン関数内では、error_get_last関数によってバックトレースを取得できます。PHP7で動作します。

于 2019-01-21T01:33:16.087 に答える