Linuxのノンブロッキングコアダンプ?


24

Linuxで実行中のプロセスの非侵入型コアダンプを取得する方法を探しています。

私はgdbに精通していますが、それはプロセスに接続されており、デバッグのために停止しているgcore場合にのみ実行できgdbます。大きなコアダンプの場合、実行が中断されるまでに数秒、または数分かかる場合があります。

ノンブロッキングの代替手段はありますか?

Linuxはcopy-on-writeメモリをサポートしますが、これはfork()なしでのサポートに依存していexec()ます。だから私は、カーネルがダンプされるプロセスのプロセスページテーブルのコピーオンライトスナップショットを取得し、元のプロセスが実行を続けている間にコアを書き出すカーネルレベルの何かを考えています。

親が幸運に進んでいる間に子gdbを強制的fork()にダンプし、wait()終了後に子を刈り取るために親に使用できると確信しています。しかし、それは面倒であり、短いものではありますが、依然として親プロセスの2つの中断が必要です。

確かに誰かがこれを必要としているのですか?


この素晴らしい質問に賛成票を1つしか与えられないのは残念です。
ペテルはモニカを復活させると14

素晴らしい質問です。私はその答えを楽しみにしています。私からの+1
thanasisk 14

1
1)gdbを使用してプロセスをアタッチする2)「call fork」コマンドでフォークする3)子プロセスのコアをダンプする4)死んだ子を親に待機させる(別の「call wait4」)5 )プロセスから切り離します6)1-5を自動化しますか?Gdbは単純なsys_ptrace()システムコールを使用します。gdbから完全に独立した、実際には複雑ではないCツールである可能性があります。
ペテルはモニカを復活させると14

1
仮想マシンでは、スナップショットを作成し、分析するクローンとしてそれを表示できます。おそらくここに記載されているツールの一つは、あなたを助ける:cyberciti.biz/programming/linux-memory-forensics-analysis-tools
ジョヴァンニTirloni

1
子プロセスもforkしてから終了することにより、2番目の中断を回避できます。その後、親プロセスは子をすぐに待機してから続行でき、祖父母はコアをダンプします。
カスペルド14

回答:


1

Google CoreDumperが思い浮かびます。プロセスのアドレス空間のコピーオンライトコピーを作成します。WriteCoreDump()を参照してください(「注」を参照)。


それは非常に便利に見えます!使用されている基礎技術は何だろうか。おそらくプロセスを追跡しますが、フォークせずに、スタックに影響を与えない方法でCoWスナップショットを作成するのは困難です。コードを見てみる必要があります。素晴らしいヒント。
クレイグリンガー14年

残念ながら、それはインプロセスのみのように見え、ptraceが自己を必要とするため、gdbなどを介して呼び出すことはできません。したがって、非ブロッキングgcoreのようではなく、Windowsでのdebughelp DLLに少し似ていますが、それでも非常に便利です。LD_PRELOADフックを介して使用し、gdbでシグナルハンドラを設定し、プロセスをデタッチしてシグナルを送信することは可能だと思いますが、変更されていないプログラムをダンプするように実際に設計されているようには見えず、問題が共有されていますプロセスが十分に台無しにされた場合、ダンプが機能しないインプロセスダンプツールによって。
クレイグリンガー14年

申し訳ありませんが…私が最初に質問を読んだとき、「邪魔にならない」ビットを見逃しました。
EricM 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.