問題タブ [bcel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - BCEL を使用して既存のメソッドにコードを挿入する
私の論文研究では、ソースを持っていないテスト スイート (この場合は DaCapo ベンチマーク スイートhttp://dacapobench.org/ ) の定義可能なメソッドにコードを挿入する必要があります。私の論文のこの部分が基づいている以前の研究では、これにバイトコード インジェクションを使用していたため、私もこれを行うようになりました。
Apache の BCEL ライブラリ ( http://commons.apache.org/proper/commons-bcel/ ) を使用して、他のステートメントの前にメソッド本体にフィボナッチ アルゴリズムを挿入できる小さなプログラムを作成しました。
今、これを作ったのですが、うまく動きません。私が注入したいくつかのメソッドは正常に動作し (フィボナッチ コードのために遅いため)、DaCapo フレームワークの実行はうまく機能しますが、他の注入されたメソッドはコードを壊します。
問題は、理由がわからないことです。どのメソッドが失敗し、どのメソッドが成功したかはわかっていますが、壊れたメソッドの繰り返しパターンを見つけることができません。
- バイトコードは問題ないようです。これまでのところ、私は見ることができますが、専門家にはほど遠いです。インジェクションの前後のバイトコードを比較すると、フィボナッチ アルゴリズムの後に残りのメソッドが続くことがわかります。唯一の違いは、スタック位置が増加したことです (インジェクトされたコードはスタック スペースも使用するため)。
- 成功したメソッドには、パブリック メソッドとプライベート メソッドが含まれていました。パラメータありとパラメータなし。
- 失敗したメソッドには例外が含まれるものもあれば、含まれないものもあります。キャッチを試行するものもあれば、そうでないものもあります。などなど
失敗したメソッドをいくつか貼り付けることもできますが、それではこの記事がさらに長くなってしまいます。それで、私が考えていないことや見落としていることはありますか?
以下に、Java ファイルの例、その結果、および私が作成した BCEL プログラムを示します。
簡単な例として、DemoClass.java という Java ファイルがあります。
私のシェルで次のJavaコマンドを呼び出した後:
javac DemoClass.java; java -cp bcel-5.2.jar:. InjectCodeBCEL DemoClass test 123456789 ; java DemoClass
(bcel-5.2.jar ファイルは、前述の apache Web サイトにあります)
プログラムは次のようになります。
これは InjectCodeBCEL.java のコードです。
アップデート
以下に、net.sourceforge.pmd.AbstractRuleChainVisitor での visitAll メソッドの注入に失敗した後の完全なエラーを示します。
このメソッドのコード (JD-GUI によって生成):
これは、コードが「insertCodeInMethod」のスタック位置の増加部分を見逃したときに発生したエラーと同等のエラーです。これにより、パラメーターが静的ではない場合、これがフィボナッチコード内で定義された変数と衝突しました。
java - BCEL は LocalVariableTable を生成できますか?
退屈なエラーに遭遇しました:
エラーの意味がよくわかりません。
私はクラスを書いてクラスを生成しましたが、それらはかなり似ています:
書きました:
生成:
「オフセット27のメソッドnet.madz.lifecycle.demo.standalone.ServiceOrder.allocateResources(JJJ)Vのオペランドスタックの型が正しくありません」と表示されているため
それは「27aastore;」ですか?この例外の原因は何ですか? 書かれたバージョンのクラスでは、Java ファイルを書き、それをクラス ファイルにコンパイルします。this.getClass() を使ってクラス参照を読み込むので、書いたバージョンでは "offset" の 13 と 14 は "aload_0;" です。および「invokevirtual 5;」しかし、生成されたバージョンでは、オフセット 13 で「ldc」を使用してクラスを直接参照しているため、2 つのバージョンを正確に合わせることができません。
通常、これらの問題を診断する方法と、実行時にオペランド スタックを監視する方法について、BCEL は LocalVariableTable をクラス ファイルに生成できますか?
java - バイトコードでは、BCEL を使用してクラスの特定の行にメソッドを追加します
Javaバイトコードを操作するためのBCELは初めてです。BCEL を使用して、.class ファイルの特定の行に新しいメソッドを挿入する必要があります。結果は、新しく挿入されたメソッドを持つクラスを含む新しい .class ファイルになります。
私はオンラインでたくさん検索しましたが、従うべき適切なコードを見つけることができませんでした. これで私を助けてもらえますか?
前もって感謝します!
java - ミッション コントロールのフライト記録ファイルを開くと、例外が発生します
Java Mission Control でアプリケーションのフライト記録を開始すると、正常に記録され、.jrf ファイルを開くと、次のような例外が発生します。
*flight_recording_2013-12-11_11_28_09.jfr からイベントをロードできませんでした。
java - BCELを使用してクラスのConstantPoolからConstantUtf8を置き換える
定数プールがいくつかの ConstantUtf8 データで構成されている Java クラス ファイルがあり
75. CONSTANT_Utf8 : SampleString
95. CONSTANT_Utf8 : SampleString
、異なるインデックス上の同じデータを意味します。次のコードを記述しました。
上記のコードは、インデックス 95 で "SampleString" を "OtherString" に置き換えますが、すべての出現箇所を置き換えたいので、次のようなループを追加しました。
インデックス、つまり 75 と 95 の両方を通過して新しい値に置き換えますが、残念ながら上記と同じ結果を生成することは、1 つのオカレンス、つまり 75 のみを置き換えることを意味します。すべてを置き換えるにはどうすればよいでしょうか?