問題タブ [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.

0 投票する
1 に答える
4416 参照

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」のスタック位置の増加部分を見逃したときに発生したエラーと同等のエラーです。これにより、パラメーターが静的ではない場合、これがフィボナッチコード内で定義された変数と衝突しました。

0 投票する
1 に答える
227 参照

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 をクラス ファイルに生成できますか?

0 投票する
1 に答える
1443 参照

java - バイトコードでは、BCEL を使用してクラスの特定の行にメソッドを追加します

Javaバイトコードを操作するためのBCELは初めてです。BCEL を使用して、.class ファイルの特定の行に新しいメソッドを挿入する必要があります。結果は、新しく挿入されたメソッドを持つクラスを含む新しい .class ファイルになります。

私はオンラインでたくさん検索しましたが、従うべき適切なコードを見つけることができませんでした. これで私を助けてもらえますか?

前もって感謝します!

0 投票する
0 に答える
919 参照

java - ミッション コントロールのフライト記録ファイルを開くと、例外が発生します

Java Mission Control でアプリケーションのフライト記録を開始すると、正常に記録され、.jrf ファイルを開くと、次のような例外が発生します。

*flight_recording_2013-12-11_11_28_09.jfr からイベントをロードできませんでした。

0 投票する
0 に答える
198 参照

java - BCELを使用してクラスのConstantPoolからConstantUtf8を置き換える

定数プールがいくつかの ConstantUtf8 データで構成されている Java クラス ファイルがあり
75. CONSTANT_Utf8 : SampleString
95. CONSTANT_Utf8 : SampleString
、異なるインデックス上の同じデータを意味します。次のコードを記述しました。

上記のコードは、インデックス 95 で "SampleString" を "OtherString" に置き換えますが、すべての出現箇所を置き換えたいので、次のようなループを追加しました。

インデックス、つまり 75 と 95 の両方を通過して新しい値に置き換えますが、残念ながら上記と同じ結果を生成することは、1 つのオカレンス、つまり 75 のみを置き換えることを意味します。すべてを置き換えるにはどうすればよいでしょうか?