web-dev-qa-db-ja.com

プロセスを強制終了せずにプロセスコアをダンプする

実際にプロセスを強制終了することなく、プロセスのコアダンプ(または同様の何か)を取得する方法はありますか?組み込みシステムでマルチスレッド化されたpythonプロセスが実行されています。そして、通常の条件下で(つまり、実行する必要がある他のプロセスを使用して)プロセスのスナップショットを取得できるようにしたいのですが、 pythonプロセスが唯一の実行中でなければ、gdbを接続する(またはgdbの下で実行する)ための十分なメモリがありません。

この質問が理にかなっているといいのですが。

12
Falmarri

通常のトリックは、何か(おそらく_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からプリロードされたイメージを生成しました。

13
geekosaur

gcoreを使用してみてください。それはあなたのためのオプションですか?

5
Leonid