私は毎晩cronジョブから実行するスクリプトを持っています。最近、スクリプトに数分後に完全に凍結し始めました。その理由を理解することはできません。これがJavaの場合は、単にkill -3 PID
を実行して、stdoutにスレッドダンプを出力します。 PHPで実行中のPHPスクリプトに現在のスタックトレース(および理想的にはメモリ情報)のダンプを取得できる同等のものはありますか?ハングしたPHPスクリプトのスタックトレースを取得
答えて
configure
の間に--enable-debug
を使用して自分でPHPをコンパイルすることをお勧めします。これはあなたが持って仕事をするためにことを
注:-)先
$ gdb -p $PHP_PID
(gdb) bt # Get a system-level stacktrace, might already give some info
(gdb) source /path/to/php-src/.gdbinit # Load some useful macros
(gdb) dump_bt executor_globals.current_execute_data
# Macro from PHP's .gbinit giving PHP stack trace
# If you for whatever reason are using a thread-safe PHP build you have to do this:
(gdb) ____executor_globals
(gdb) dump_bt $eg.current_execute_data
そしてデバッグ:プロセスはその後、まだハングする場合は、これらの手順を使用してPHPレベルのスタックトレースを取得するには、GDBといくつかのマクロを使用することができますシンボル情報を持つPHPバイナリを使用するには、--enable-debug
が必要です。
こんにちは。同じ方法でPHP変数の現在の値を出力することは可能ですか? – shark555
私の頭の上から:dump_ht executor_globals.active_symbol_table(使用する変数の名前を確認する:lxr.php.netまたはローカルのPHPソースツリーに行き、executor_globals定義を確認する) – johannes
私はpthreads拡張子を使用していますPHPのマルチスレッド化)、これが機能するためにはスタックフレームに 'tsrm_ls'引数の値を指定してset_ts(else ____executor_globalsがクラッシュ)コマンドを最初に使用しなければなりませんでした。 – 2072
はい。あなたはdebug_backtrace
とバックトレースを得ることができます。またmemory_get_usage
が必要な場合もあります。
私の問題は、どこにぶら下がっているのか分かりません。私がした場合、これは簡単な解決策になります。 –
PHPスクリプトは、最大実行時間を超えるとタイムアウトする必要があります。確かにそれはあなたのために問題を解決するでしょう。それが壊れるのを待って、あなたのスタックトレースがあります。
コード(またはphp.ini)に、最大実行時間をゼロに設定して中断させないようにしている可能性があります。あなたがそれを持っている場合は、それを取り除く(または、デフォルトが本当に小さすぎると非常に大きなタイムアウトに設定する)。
xDebugまたは同様のツールを使用して実行すると、プログラムの呼び出しツリーを表示するプロファイラトレースが表示され、IDEのコードをステップ実行することもできます。何が起こっているかを正確に見ることができます。そこに無限ループがある場合は、それをかなり素早く識別することができなければなりません。
これは長時間実行されるスクリプトです。時には数時間かかることがあります。私は定期的に実行している機能のための合理的な量のタイムアウトをリセットしますが、これはどういうわけか私の問題をキャッチしません。 –
私はpcntl_signalを使用して解決策があることに気付きました。私はそれを自分で試したことがない、あなたはここでいくつかのサンプルコードを見つけることができます。
https://secure.phabricator.com/D7797
function __phutil_signal_handler__($signal_number) {
$e = new Exception();
$pid = getmypid();
// Some phabricator daemons may not be attached to a terminal.
Filesystem::writeFile(
sys_get_temp_dir().'/phabricator_backtrace_'.$pid,
$e->getTraceAsString());
}
if (function_exists('pcntl_signal')) {
pcntl_signal(SIGHUP, '__phutil_signal_handler__');
}
このオプションは '--debug configureスクリプトに-enableフラグを設定します。しかし、私はあなたがconfigure augmentsで遊ぶことができないなら、このレベルのデバッグをやっているとは思っていません。 –
インストールしたPHPのためのgdbとデバッグシンボルを持って提供は、あなたが完全なPHPバックトレースを取得することができます。
デバッグシンボルをインストールする方法は、ディストリビューションごとに異なる場合があります。たとえばAmazon Linuxではrpm -qa | grep php56-common
を実行し、結果をdebuginfo-install
に渡しました。 AmazonのLinuxでは、yum install php56-debuginfo
を実行しているときに、別のバージョンのPHP用のデバッグシンボルがあり、gdbはそれを好まなかったことに注意してください。
がある場合は、バックトレースを取得するためにプロセスを実行する必要はありません。 kill -ABRT $pid
を実行し、後でコアダンプを調べることができます。
実行中のプロセスのデバッグをgdb -p $pid
またはgdb /usr/bin/php $path_to_core_dump
のコアダンプで開始できます。
bt
と入力すると、Cスタックトレースが得られます。これは時には間違っているかもしれないことのヒントを与えるのに十分です。デバッグシンボルが正しくインストールされていることを確認してください。 bt
は、PHPソースコードのファイル名と行番号を指す必要があります。
今すぐ試すp executor_globals.current_execute_data
それは$1 = (struct _zend_execute_data *) 0x7f3a9bcb12d0
のようなものを出力するはずです。もしそうなら、それはgdbがPHPの内部を検査できることを意味します。
小さなPythonスクリプトを使用すると、完全なPHPバックトレースを生成できます。 python-interactive
を入力してから、この小さなスクリプトを挿入します。この方法は、PHPの内部に大きく依存するので、それはそれ以前またはそれ以降のバージョンでは動作しない場合がありますことを
def bt(o):
if o == 0: return
print "%s:%d" % (o["op_array"]["filename"].string(), o["opline"]["lineno"])
bt(o["prev_execute_data"])
bt(gdb.parse_and_eval("executor_globals.current_execute_data"))
注意を。私はこれをPHP 5.6.14で行いました。この方法の利点は、実行中のプロセスとコアダンプの両方で動作し、PHPを再コンパイルしたり、PHPスクリプトを再起動する必要がないことです。また、の後にgdbをインストールして、デバッグシンボルを実行すると、ハングするプロセスが検出されます。
- 1. javascriptのPHPスクリプトからデータを取得
- 2. PHPスクリプトをトリガーしようとしました.EXC_BAD_ACCESSを取得しました
- 3. Windowsがアプリのハングを検出したときにスタックトレースを記録する
- 4. ExtendScriptでエラーのスタックトレースを取得する
- 5. ロガーでスタックトレースを取得する
- 6. C++例外でスタックトレースを取得する
- 7. Jasmine BDDを使用して実行したコードのスタックトレースを取得する
- 8. C#スタックトレースを使用しない呼び出しメソッドの取得
- 9. PHPスクリプトがPythonスクリプトから出力を取得できない
- 10. シェルスクリプト内のPHPスクリプトから終了ステータスを取得します。
- 11. Qtでスタックトレースまたはデバイスクラッシュログを取得する方法は?
- 12. gremlin-groovyスクリプトの例外時に行番号または完全なスタックトレースを取得する
- 13. PHPを使用したbashスクリプトから戻り値を取得する
- 14. jQueryまたはPHPスクリプトを使用してページ情報を取得する
- 15. 画像を取得してphpスクリプトで表示
- 16. Flex 4はPHPスクリプトからデータを取得しますか?
- 17. スタックトレースを取得し、スキーマでデバッガを使用する
- 18. FastMMからもっと長いスタックトレースを取得しますか?
- 19. AndroidアプリがクラッシュしたときにC++スタックトレースを取得できますか?
- 20. PHPでpreg_replaceを取得したエスケープ
- 21. $$と<generated>はJavaスタックトレースで何を意味しますか?私はこのようなスタックトレースを取得
- 22. C#からPHPスクリプトの出力を取得
- 23. 私のPHPスクリプトで非オブジェクトエラーを取得する
- 24. JAVAのPHPスクリプトからデータを取得する
- 25. Django:実行時の警告のためのスタックトレースを取得する方法
- 26. スタックトレースを取得する方法androidのC++関数名
- 27. スタックトレースから実際のタイプを取得できますか?
- 28. "Invalid chrome URI"例外のスタックトレースを取得するには?
- 29. VS 2008デバッガですべてのスタックトレースを取得する方法
- 30. バイナリライブラリのクラッシュからスタックトレースを取得できますか?
シンプルなソリューションでは、いくつかのロギングステートメントをコードにスローし、実行中のどこで停止するかを確認します。 – Sammitch