13

環境:Linux、Eclipse Juno、Java 7、JUnit

単純なアプリケーション(mainメソッドを持つJavaクラス)をデバッグモードで実行すると、Eclipseで「フレームにドロップ」機能が正常に機能します。ただし、同じメソッドがjunitテストケースから呼び出された場合、Eclipseでは「フレームにドロップ」機能が無効になります。ドキュメントから

このコマンドは、現在のVMがフレームへのドロップをサポートしており、選択したスタックフレームが最上位フレームまたはネイティブメソッドのフレームではない場合にのみ使用できることに注意してください。

junitテストケースの実行時にデバッグウィンドウのスタックフレームからわかるように、ネイティブのフレーム「NativeMethodAccessorImpl.invoke」があります。これが「DroptoFrame」が無効になっている理由だと思います。

この推論が正しいかどうか、そして正しい場合は、これを克服するために利用できる回避策を教えてください。

4

3 に答える 3

10

WindowsでEclipse Luna、Java 7を使用しています。状況は説明どおりです。「NativeMethodAccessorImpl.invoke」フレームの直後に続くテスト メソッドでは、「フレームへのドロップ」が無効になっています。「フレームへのドロップ」の無効状態は、クラス(私のディストリビューションでは)の一部のメソッドにcanDropToFrame()それぞれバインドされています。メソッド supportsDropToFrame() は、特定のフレームをドロップできるかどうかを確認し、テストします。supportsDropToFrame()org.eclipse.jdt.internal.debug.core.model.JDIStackFrameplugins/org.eclipse.jdt.debug_3.8.102.v20150115-1323/jdimodel.jar

  1. JVM はフレームのドロップをサポートしている必要があります
  2. フレームは最上位のフレームであってはなりません
  3. フレームはネイティブであってはなりません
  4. 前のフレームはネイティブであってはなりません

したがって、Ramesh の仮定は正しかった。これは、テスト 3 + 4 の元のコード スニペットです。

int index = 0;
JDIStackFrame frame = null;
while (index < frames.size()) {
    frame = (JDIStackFrame) frames.get(index);
    index++;
    if (frame.isNative()) {
        return false;
    }
    if (frame.equals(this)) {
        if (jdkSupport) {
            // JDK 1.4 VMs are currently unable to pop the
            // frame directly above a native frame
            if (index < frames.size()
                    && ((JDIStackFrame) frames.get(index))
                            .isNative()) {
                return false;
            }
        }
        return true;
    }
}

コメントは、それが JDK 1.4 回で書かれたことを示唆しているため、当面の間、JVM はネイティブ フレームの上にフレームをドロップすることもできます。

テスト 4 をスキップする JDIStackFrame のパッチを適用したバージョンを作成しました。JUnit テスト メソッドで一時停止すると、予想どおり、「フレームへのドロップ」が有効になりました。

しかし、実際にフレームをドロップすると、「com.sun.jdi.InternalException: Got error code in reply: 32 occured popping stack frame」というエラー メッセージ ボックスが表示されました。

これはJDWPエラーコードだと思います。したがって、このような「フレームへのドロップ」は JDK 1.7 (1.8 については不明) では機能しないようで、Eclipse のものではありません。

于 2015-06-07T14:00:46.437 に答える