26

奇妙な状態の Python アプリケーションがあります。私はプロセスのライブデバッグをしたくありません。ファイルにダンプして、後でその状態を調べることはできますか? 後で gdb で C プログラムのコアファイルを復元したことは知っていますが、gdb から便利な方法で Python アプリケーションを調べる方法がわかりません。

(これは、本番システムでの memleaks のデバッグに関する私の質問のバリエーションです。)

4

4 に答える 4

4

(os.abort() を使用して、リソース制限で許可されている場合はコアダンプを発生させる) 中止以外の組み込みの方法はありません。そのための既製のツールはありません。

Python プロセスのコアファイルの処理に関しては、 Python ソースには便利なマクロを含むgdbinit ファイルがあります。何らかの方法でプロセス自体 (pdb または対話型インタープリターを使用) に入るよりもはるかに苦痛ですが、生活が少し楽になります。

于 2008-09-26T20:38:17.633 に答える
1

プロセスからすべてのデータをダンプするようなものを書くことも可能です。

  • ピクルスできないオブジェクトを無視するピクラー(それらを他のものに置き換える)(例:Python:ピクルスできないアイテムでdictをピクルスにする
  • すべてを再帰的にシリアル化可能なものに変換するメソッド(たとえば、これは、無限に再帰するオブジェクトをチェックしてそれらを処理する必要がある場合を除きます。また 、拡張クラスなど、未知のオブジェクトの一部を処理しようdir()とする可能性もあります)。getattr()

しかし、実行中のプロセスをマンホールやパイロンなどで残すことは、可能であれば確かに便利なようです。

(また、この質問が最初に尋ねられて以来、もっと便利なものが書かれたのだろうか)

于 2012-10-02T12:30:03.527 に答える
1

上記の誰かが、これを実行する組み込みの方法はないと言いましたが、それは完全に真実ではありません。例として、pylons デバッグ ツールを見てみましょう。例外が発生すると、例外ハンドラーはスタック トレースを保存し、HTTP 経由でデバッグ セッションを取得するために使用できる URL をコンソールに出力します。

これらのセッションはメモリ内に保持されている可能性がありますが、それらは単なる Python オブジェクトであるため、スタック ダンプをピクルして後で検査のために復元することを妨げるものは何もありません。それはアプリへのいくつかの変更を意味しますが、それは可能であるはずです...

いくつかの調査の結果、関連するコードは実際には Paste のEvalException モジュールから来ていることがわかりました。そこを見て、何が必要かを理解できるはずです。

于 2008-09-26T21:30:33.530 に答える
0

この回答は、プログラムのコアダンプを作成してから、十分に類似した別のボックスで実行を継続することを提案しています。

于 2008-09-27T00:15:31.417 に答える