7

従来のZope2Webサイトを運営し、それに不満を持っている必要があります。最大の問題は、時折、ロックアップし、100%のCPU負荷で実行され、要求に応答しなくなることです。この問題は定期的に再現することはできませんが、3つの動的グラフを含む1ページで問題が発生することがあるため、ある種の競合状態が原因で無限ループやビジーウェイトが発生しているのではないかと思います。

問題は、私はまだこのことをデバッグする方法を見つけていないということです。Zopeログには何もありませんし、システムログにも何もありません。スタックトレースを取得するためにこの質問からの提案を試しましたが、効果がある唯一のシグナルはですSIGKILL

プロセスがスタックしたときにプロセスが正確にどこにあるかを見つける別の可能性はありますか?

4

6 に答える 6

9

ピラサイトを使用して、優れたスタックトレースを印刷できます。

まず、gdbをインストールする必要があります。

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb

次に、pyrasiteをインストールします。

$ pip install pyrasite

psまたは他の方法を使用して、スタックしたPythonプロセスのプロセスIDを見つけ、それを使用して実行pyrasite-shellします。

# Assuming process ID is 12345
$ pyrasite-shell 12345

これで、PythonREPLが表示されます。REPLで以下を実行して、すべてのスレッドのスタックトレースを確認します。

import sys, traceback
for thread_id, frame in sys._current_frames().items():
    print 'Stack for thread {}'.format(thread_id)
    traceback.print_stack(frame)
    print ''
于 2017-06-03T00:23:35.767 に答える
2

このSOの質問に対する私の答えを参照してください。Products.signalstackを使用してください。製品登録時に、すでに見つけた回答と同じハンドラーを登録します。おそらくそれはあなたにとってよりうまくいくでしょう。

そうでない場合は、OSレベルのI / Oの問題が発生している可能性があります。唯一の希望は、gdbをプロセスにアタッチすることです。StackOverflowでgdbの回答を検索します。ここには豊富な情報があります!

于 2009-11-23T15:26:46.400 に答える
1

実行中のプロセスにデバッガーを接続してみてください。この質問も参照してください。

于 2009-11-23T09:17:42.663 に答える
1

ピラサイトは機能する可能性がありますが、一部のコーナーケースを処理せず、サイレントにハング/失敗します。

パッケージが期待どおりに機能しない場合は、パッケージが内部で行うことを手動で実行して、何が問題だったかを把握することができます。

  • gdbをPythonプロセスにアタッチします:(必要な場合があります)gdb -p <PID>sudo
  • コマンドをgdbに入力して、次の関数を実行します
set $gstate = PyGILState_Ensure()
call          PyRun_SimpleString(" <some Python code> ")
call          PyGILState_Release($gstate)

関数については、 Python APIのドキュメントを参照してください:12


Pythonがデバッグシンボルでコンパイルされていない場合は、関数の明示的なデータ型を提供する必要があります。

Pythonソースコードhttps://github.com/python/cpython/blob/4fe5585240f64c3d14eb635ff82b163f92074b3a/Include/pystate.h#L86-L88を参照してください。タイプPyGILState_STATEは2つの値を持つ列挙型であるため、使用できると「推測」します。int。(動作しない場合がありますが。

結論として、ドキュメントによると、関数の「正しい(上記の制限に従う)」コマンドは次のとおりです。

set $gstate = ((int (*)())            PyGILState_Ensure ) ()
call          ((int (*)(const char*)) PyRun_SimpleString) (" <some Python code> ")
call          ((void(*)(int))         PyGILState_Release) ($gstate)

このソリューションは、gdbのPythonデバッグ拡張機能に依存していません。それ以外の場合は、単に実行することが可能py-btです。


私は、(現在)pyrasite-ngという名前のピラサイトのより最新のフォークを持っています。そこに報告できるバグがあれば、すぐに修正できるといいのですが。

于 2021-12-11T01:31:37.710 に答える
0

他の信号が通過しない方法でプロセスがスタックしている場合は、実行時に接続を試みるのではなく、デバッガーからプロセスを実行することを検討することをお勧めします。

また、コードの特定の部分をオフにして、それがまだ再現可能である最小限のケースを見つけて、何が原因であるかを確認するなど、他のデバッグ戦術にも役立つ場合があります。

于 2009-11-23T09:21:07.920 に答える
0

しばらくの間インターネットを輪になって走り回った後、私はついにここにたどり着きました:http: //podoliaka.org/2016/04/10/debugging-cpython-gdb/-すべての要素がどのように組み合わされるかを詳細に説明しています。私の見積もりは'gdb / usr / bin / python -p $ PID'でした-gdbが正しいデバッグ情報ファイルを見つけるには、実行可能ファイルの名前が必要です。

于 2016-09-26T22:21:43.360 に答える