実際にプロセスを強制終了することなく、プロセスのコアダンプ(または同様の何か)を取得する方法はありますか?組み込みシステムでマルチスレッド化されたpythonプロセスが実行されています。そして、通常の条件下で(つまり、実行する必要がある他のプロセスを使用して)プロセスのスナップショットを取得できるようにしたいのですが、 pythonプロセスが唯一の実行中でなければ、gdbを接続する(またはgdbの下で実行する)ための十分なメモリがありません。
この質問が理にかなっているといいのですが。
通常のトリックは、何か(おそらく_SIGUSR1
_のような信号)がプログラムをトリガーしてfork()
にし、子がabort()
を呼び出してコアをダンプすることです。
_from os import fork, abort
(...)
def onUSR1(sig, frame):
if os.fork == 0:
os.abort
_
初期化中
_from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)
_
このように使用すると、アドレス空間のほとんどすべてが共有されるため、fork
が余分なメモリを消費することはありません(これがコアダンプの生成に機能する理由でもあります)。
むかしむかし、このトリックはundump
というプログラムで使用され、コアダンプから実行可能ファイルを生成して、複雑な初期化後にイメージを保存しました。 emacs
を使用して、temacs
からプリロードされたイメージを生成しました。
gcore
を使用してみてください。それはあなたのためのオプションですか?