2010-11-30 21 views
1

JIST/SWANSというツールを使用して実行しているシミュレーションの一部として、いくつかの奇妙なエラーが発生しています。このシミュレータはJava 1.4向けに書かれており、1.5に移植しようとしています。スタック操作で奇妙なエラーが発生する

私がしようとしているのは、1.5 SDKで元のコードをコンパイルすることです。問題は、シミュレータがbcelを使用してバイトコードを書き換えて、JVMをシミュレーションに使用できることです。新しいSDKの下でコードをコンパイルすると、以下のエラーが表示されます。誰かがこれを修正する正しい方向に私を指すことができますか?私は1.4と1.5で生成されたバイトコードが多少異なることを知っていますが、どこから探し始めるべきかわかりません。

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.remove(ArrayList.java:390) 
    at org.apache.bcel.verifier.structurals.OperandStack.pop(OperandStack.java:135) 
    at org.apache.bcel.verifier.structurals.ExecutionVisitor.visitPUTFIELD(ExecutionVisitor.java:1048) 
    at org.apache.bcel.generic.PUTFIELD.accept(PUTFIELD.java:78) 
    at jist.runtime.RewriterFlow.execute(RewriterFlow.java:235) 
    at jist.runtime.RewriterFlow.doFlow(RewriterFlow.java:187) 
    at jist.runtime.RewriterTraversalContinuableMethods.doMethod(Rewriter.java:3059) 
    at jist.runtime.ClassTraversal.processMethodGen(ClassTraversal.java:136) 
    at jist.runtime.ClassTraversal.processClassGen(ClassTraversal.java:96) 
    at jist.runtime.ClassTraversal.processClass(ClassTraversal.java:63) 
    at jist.runtime.Rewriter.rewriteClass(Rewriter.java:621) 
    at jist.runtime.Rewriter.findClass(Rewriter.java:410) 
    at jist.runtime.Rewriter.loadClass(Rewriter.java:367) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) 
    at java.lang.Class.getDeclaredMethod(Class.java:1935) 
    at jist.swans.app.AppJava.findMain(AppJava.java:86) 
    at jist.swans.app.AppJava.<init>(AppJava.java:61) 
    at driver.aodvtest.createNode(aodvtest.java:192) 
    at driver.aodvtest.createSim(aodvtest.java:235) 
    at driver.aodvtest.main(aodvtest.java:277) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at jist.runtime.Bootstrap$JavaMain.startSimulation(Bootstrap.java:163) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at jist.runtime.Controller.processEvent(Controller.java:650) 
    at jist.runtime.Controller.eventLoop(Controller.java:428) 
    at jist.runtime.Controller.run(Controller.java:457) 
    at java.lang.Thread.run(Thread.java:619) 

java.lang.NullPointerException 
    at driver.aodvtest.createNode(aodvtest.java:198) 
    at driver.aodvtest.createSim(aodvtest.java:235) 
    at driver.aodvtest.main(aodvtest.java:277) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at jist.runtime.Bootstrap$JavaMain.startSimulation(Bootstrap.java:163) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at jist.runtime.Controller.processEvent(Controller.java:650) 
    at jist.runtime.Controller.eventLoop(Controller.java:428) 
    at jist.runtime.Controller.run(Controller.java:457) 
    at java.lang.Thread.run(Thread.java:619) 

UPDATE:例外がスローされている場所から、私はこのラインに絞ら :この関数に渡されているクラスのmain方法があり

private Method findMain(Class<?> c) throws NoSuchMethodException { 
    return c.getDeclaredMethod("main", new Class<?>[] { String[].class }); 
} 

ので、私は、なぜ返すのか分からないnull

UPDATE 2:

createNode(..., ..., ..., ..., MyClient.class, ..., ...) 

上記投稿findMain方法でこれを利用する機能にMyClient.classを渡し:

つの機能があります。デバッガを使用すると、私はdeclaredMethodsnullであることがわかりますので、明らかにgetDeclaredMethodsコールが死んでいます。 MyClientクラスは次のように内部静的クラスとして定義されています

public static class MyClient { 
    public static void main(String[] args[]) { 

     ... 

    } 
} 

私は、これがdeclaredMethodsはので、私は別のクラスになく、運を持つクラスを抽出しようとしたnullさとは何かを持っているかどうかわからないです。

UPDATE 3:

OK]をクリックして、それを絞り込みます。以下であってもメインクラスで例外がスローされます。

System.out.println(MyClient.class.getDeclaredMethods()); 
+0

AFAIKの場合、1.5 VMは修正なしで1.4に対してコンパイルされたコードを実行できるはずです。 1.4で同じコードを実行できますか? – CurtainDog

+0

@CurtainDog:はい。それは何の問題もなく実行されます。しかし、バイトコード表現は1.4から1.5に変更されていませんか?あるいは、私が間違っているかもしれません... – Legend

+0

はい、1.5ジェネリックスなどを扱うための追加の手順がありますが、.classファイルの先頭に.classファイルがコンパイルされたSDKバージョンがあり、 VMをどのように扱うかについて説明します。 – CurtainDog

答えて

1

はおそらく、BCELのソースコードをダウンロードし、この方法

org.apache.bcel.verifier.structurals.OperandStack.pop(OperandStack.java:135) 

の行135にブレークポイントを置くことは、より多くのことを教えてくれます。明らかに、配列インデックス操作のどこかに問題があります。

私が見ていることから、BCELは開発中ではありません。バグが存在する場合、報告してもそれを修正するのは難しいかもしれません。

ASMは、開発中の最新のバイトコード生成ライブラリです。あなたはすでにこれを知っているでしょう。そのシミュレータのソースコードを持っていて、BCELをあまり使用していない場合は、ASMを使用して書き直すことができます。もちろん、このようなものは通常は不当です。

+0

+1ありがとうございます。はい。私がこの作業を始めたとき、私はBCELが中止されたことに気付きました。残念ながら、このシミュレーターはBCELに基づいて作成されているので、書き換えは私のための即刻の贅沢ではありません。私はあなたが提案したようにソースで何かを見つけ出すことができるかどうかを見ていきます。 – Legend

+0

追加情報が役立つ場合は、私の質問を更新しました。 – Legend

関連する問題