この質問の内容と同様の点がhereおよびhereの前に提起されており、Google コアダンプ ライブラリを認識しています (これは評価して不足していることがわかりましたが、問題をよりよく理解していればそれに取り組むことができるかもしれません) )。
プロセスを中断することなく、実行中の Linux プロセスのコア ダンプを取得したいと考えています。自然なアプローチは、次のように言うことです。
if (!fork()) { abort(); }
フォークされたプロセスは元のプロセスのメモリの固定スナップショット コピーを取得するため、完全なコア ダンプを取得する必要があります。また、コピーはコピー オン ライトを使用するため、通常はコストがかかりません。ただし、このアプローチの重大な欠点はfork()
、現在のスレッドのみをフォークし、元のプロセスの他のすべてのスレッドがフォークされたコピーに存在しないことです。
私の質問は、他の元のスレッドの関連データを何らかの方法で取得できるかどうかです。この問題へのアプローチ方法は完全にはわかりませんが、思いついたいくつかのサブ質問を次に示します。
すべてのスレッドのスタックを含むメモリは、フォークされたプロセスで引き続き使用可能であり、アクセス可能ですか?
元のプロセスで実行中のすべてのスレッドを (すばやく) 列挙し、それらのスタックのベースのアドレスを保存することは可能ですか? 私が理解しているように、Linux のスレッド スタックのベースには、カーネルのスレッド ブックキーピング データへのポインターが含まれているため、...
保存されたスレッド ベース アドレスを使用して、フォークされたプロセスの元のスレッドのそれぞれに関連するデータを読み取ることができますか?
それが可能であれば、コア ダンプに他のスレッドのデータを追加するだけでよいでしょう。ただし、そのデータがフォークの時点ですでに失われている場合、このアプローチに希望はないようです。