web-dev-qa-db-ja.com

Eclipseデバッガーに戻る方法は?

Eclipseデバッガーで逆実行することは可能ですか?私が取り組んでいる現在のプロジェクトでは、ファイルからデータを読み取って初期化するまでに、少なくとも5秒かかります。デバッガーでオーバーステップした場合、プログラムを終了して再起動する必要があり、これにはかなりの時間がかかります。

125
Jason

Eclipseの drop to frame コマンドを使用して、現在のメソッドを上から再入力できます。ただし、発生した状態変更は展開されないため、使用しているメソッドの種類によっては機能しない場合があります。

実際に時間をさかのぼって移動できる別の本当にクールなツールは、 Omniscient Debugger です。クラスローダーにロードされるときにクラスをインスツルメントすることで機能するため、コードが実行するすべてを記録できます。 「このフィールドに現在の値がいつ、どこで、なぜ割り当てられたのか」と答えるなど、非常にクールなことができます。 UIはかなり不格好で、大きなコードベースの処理に苦労することがありますが、場合によっては多くの時間を節約できます。

UpdateChronon は、「DVR for Java」と呼ばれる商用製品を提供します。 ODBと同じもの。

133
Matt McHenry

以前の回答で言及されたものを超えて-すなわち、Eclipseの debug view のフレームへのドロップ機能は、スタックフレームの早い段階でデバッグを再開します(ただし、グローバル/静的データは元に戻しません)および Omniscientデバッガー 、これは少し生であまり進化していません 実行)時間に「戻る」ために使用できるEclipseベースのツールがいくつかあります。

JIVEは、プログラムの状態を記録する機能を備えたEclipse Javaデバッガーを拡張します。 JIVEパースペクティブは、プログラムの実行中に更新されるいくつかの有用なUML図を提供します。これらの図は、アプリケーションの状態(オブジェクト図)とスタックトレース(シーケンス図)の概要を提供します。記憶されたトレースを照会し、時間を前後に進めて、対応する図を見ることができます。

Diverはメソッド呼び出しのみを記録し、JIVEのようなプログラムの状態は実際には記録しません。すべてのメソッド呼び出しイベントは、後で取得および分析するために保存されます。主にフィルターを指定するために、Java実行およびデバッグ構成を拡張します。トレースは、実行時に一時停止/再開/フィルタリングできます。記録されたDiverパースペクティブは、インタラクティブシーケンス図に表示できます。

JIVEとDiverは、学術研究から発行されたオープンソースプロジェクトです。 2012年11月現在、両方のプロジェクトがアクティブです。

Chrononは商用製品ですが、学生およびオープンソースプロジェクトの無料ライセンスがあります。彼らのウェブサイトで主張されていることから、それはおそらく最も包括的なレコーダーです。記録された履歴を再生したり、前後に移動したりすることができるためです。また、記録にはEclipseは必要ありません。

これらのプラグインはすべてリソースに貪欲であるため、優れたスペックのマシンを用意し、フィルター機能を使用することをお勧めします。それらを正常に実行するための明確な要件は、 Eclipse.iniのヒープスペースを拡張する です。

私の場合、JIVEとDiverを使用してXML解析プログラムをデバッグしようとしましたが、リソース不足のために常にEclipseがフリーズしてしまいました。 Diverは Linux 64ビットで実行するのが難しい である可能性があり、ubuntu 32ビットおよび場合によっては これらのヒント を使用する他の32ビットディストリビューションで動作します。 DiverはWindowsで動作しますが、Windows 64ビット+ 64ビットJVMで動作します。それ以外の場合は、 2ビットウィンドウでの最大ヒープスペース1.3-1.6Gb に制限されます。 JIVEは私のLinux 64ビットでうまく動作し、他のプラットフォームでも問題なく動作するようです。

44
fmjrey

はい、Eclipse CDTは履歴デバッガー機能をサポートしています。

開くデバッグ構成-> デバッガー-> 起動時のリバースデバッグを有効にする.

shift+F5shift+F6を押すと、ステップバックにF5またはF6を押すことができます。

12
Sergei

私は偏見がありますが、 Chronon はまさにあなたが探しているものです。

フレームへのドロップは、メソッドがヒープ上の何かを変更した場合、元に戻されないため、正確にステップバックしません。

5
pdeva

Eclipseでもこの機能を探していました。私はビジュアルスタジオがそれをできることを知っています。実際には、現在のラインマーカーをドラッグして、コード内の任意の場所にドロップできます。変数の変更を元に戻すことができるかどうかはよくわかりません。しかし、それでもなお非常に有用であり、多くの時間を節約します。 Eclipseでこれを非常に長い間待っていました。

3

質問はEclipse言語を指定しておらず、回答の多くはJavaを想定しています。

GDBデバッガーでC++とGCCを使用する場合、EclipseにはRun->Move to Lineがあり、Visual Studio Set Next Statement のようなジョブと機能を実行します。この場合、EclipseはGDBにある機能を使用しています。

Javaを使用している場合、EclipseまたはNetbeansでJavaを使用する方法はわかりませんが、他の回答ではプラグインが推奨されています。 Eclipseには、私のバージョン(Juno SR1)のJavaで機能する「drop to frame」コマンドがあります。デバッグモードで関数内のコードを変更して保存すると、実行行が現在の関数の先頭に自動的に移動し、そこから続行できます。行を指定することと同じではありませんが、それは何かです。

1
GravityWell