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


12

プロセスを実際に強制終了せずに、プロセスのコアダンプ(または同様のもの)を取得する方法はありますか?組み込みシステムでマルチスレッドpythonプロセスを実行しています。そして、私は通常の状態(つまり、実行に必要な他のプロセス)でプロセスのスナップショットを取得できるようにしたいのですが、Pythonプロセスなしでgdbに接続する(またはgdbで実行する)十分なメモリがありません実行している唯一のものです。

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


これがデバッグ中のみの場合、NFSファイルやネットワークブロックデバイスのスワップのようなおかしなことを考えたことがありますか?
ジル 'SO-悪である停止

回答:


13

通常のトリックは、何か(おそらくのようなシグナル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


5

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


ある時点でgcoreはスタンドアロンプ​​ログラムでしたが、gdbパッケージの一部ではないと思います-ただし、gdb --pid = <PID>を実行してから、gcoreコマンドを使用してコアファイルをダンプできます。gcore.cは、より軽量なものが必要な場合に簡単にグーグル化できるかなり単純なプログラムです。
シンセサイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.