「コア」ファイルを生成し、別のマシンにコピーしてから、そのマシンでコア ファイルの実行を続行できるかどうか疑問に思っていました。
実行中のプロセスからコア ファイルを作成する gcore ユーティリティを見てきました。しかし、コアファイルに基づいて gdb が実行を継続できるとは思いません。
ヒープ/スタックをダンプして後で復元する方法はありますか?
「コア」ファイルを生成し、別のマシンにコピーしてから、そのマシンでコア ファイルの実行を続行できるかどうか疑問に思っていました。
実行中のプロセスからコア ファイルを作成する gcore ユーティリティを見てきました。しかし、コアファイルに基づいて gdb が実行を継続できるとは思いません。
ヒープ/スタックをダンプして後で復元する方法はありますか?
コアファイルからではなく、最新のシステムではできません。Linux で個々のプロセスをフリーズおよび復元するために、CryoPIDと新しいカーネルベースのチェックポイントおよび再起動が開発中ですが、現在のところ、それらの機能はかなり制限されています。 OpenVZやその他の仮想化に似たソフトウェアは、システム全体をフリーズして復元できます。
また、 Condorプロジェクトもチェックしてください。コンドルは並列ジョブでもそれを行うことができます。また、Condor には、ワークステーションの使用を再開した場合などにプロセスを自動的に移行できるモニターも含まれています。ネットワーク化された環境で予備のサイクルを利用するように設計されています。
これは、一般に、任意のプロセスを別のマシンで継続させるのに十分ではありません。ヒープとスタックの状態に加えて、開いている I/O ハンドル、割り当てられたハードウェア リソースなどもある場合があります。
オプションは、信号で状態をダンプし、後でダンプされた状態から再開できるようにソフトウェアを明示的に作成するか、仮想マシンでソフトウェアを実行し、それを代替ホストに移行することです-XenとVmwareの両方がサポートされていますフリーズ/復元とライブ マイグレーション。
とはいえ、CryoPIDはこれを正確に行おうとし、成功することもあります。
場合によっては、これを行うことができます。たとえば、Emacs のビルド プロセスの一部は、すべての Lisp ライブラリをロードしてから、すばやくロードできるようにメモリ イメージをディスクにダンプすることです。他のいくつかの言語インタープリターもそれを行っています (私は主に Lisp と Scheme の実装について考えています)。ただし、それらはそのような用途向けに特別に設計されているため、それを機能させるためにどのような特別なことをしなければならないかはわかりません.
ランダムなプログラムでこれを行うのは非常に難しいと思いますが、すべてのオブジェクトがシリアル化/逆シリアル化をサポートするフレームワークを作成した場合、プログラムで使用されるすべてのオブジェクトをシリアル化し、それを別の場所に出荷して、違った終わり方。
仮想化に関する他の人々の回答もその場にあります。
やりたいことが簡単にできない理由はたくさんあります。たとえば、他のマシンでコア ファイルを復元する場合、処理中に開いていたファイル記述子をどのように解決しますか? ソケット、名前付きパイプ、セマフォ、またはその他の OS レベルのリソースはどうですか? 基本的に、システムがそのような操作を処理するように特別に設計されていない限り、単純にコア ファイルをダンプして別のマシンに移動することはできません。
機種によります。たとえば、非常に小さな組み込みシステムでは非常に実行可能です。Beowulf クラスターやその他のスーパーコンピューター風のアプリにもある程度実装されていると思います。
これが可能だとは思いません。ただし、仮想化ソフトウェア ( Xenなど) を調べて、システム イメージ全体を凍結し、あるマシンから別のマシンに移動できるようにすることをお勧めします。