問題タブ [bytecode-manipulation]

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 投票する
2 に答える
167 参照

java - 特定の命令を実行する前に JVM の状態を記憶する

私は突然変異技術を使ったテストプロジェクトに取り組んでいます。私のプロジェクトでは、Java クラスファイルを操作し、テストのためにクラスファイルを複数回再実行する必要があります。私の実装では、1 回の操作後にシステム全体を再実行する必要がありますが、これは効率的ではありません。各操作の後にその状態から開始できるように、クラスファイルで目的の命令を実行する直前に JVM 状態を保存できるかどうか疑問に思っています。

ありがとうございました。

0 投票する
2 に答える
2779 参照

java - What bytecode library when controlling line numbers?

I need to generate new classes (via generation of java byte code) from existing classes. I will analyse the body (expressions) of the methods of a class. The expressions will determine what code I will generate.

For me it is importand to set the source file for the new classes (same as base java file) as well as controlling line numbers (when an exception is thrown the stacktrace should contain line numbers of the base java file).

Example: I have the file BaseClass.java. The compiler generates a BaseClass.class from this. I'd like to analyse this class file and generate the byte codes for a GeneratedClass.class. When at c an exception is thrown the stacktrace should contain "BaseClass.java line 3".

My question: are there libraries that support this requirement? Javassist, ASM or BCEL? What to use for this purpose? Hints how to do it or example code would be especially helpfull.

Edit: Hints what library NOT to use because the requirement can NOT be fullfiled would be helpfull, too :).

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

java - バイトコードを変更して javassist で保存することはできますか?

私がウェブ上で見つけたすべての参考文献は、実行時にバイトコードを変更できると言っていますが、その変更されたバイトコードが元のバイトコードを置き換えることができるかどうかはわかりません.

このようにして、元のバイトコードを 1 回置き換えることができ、残りの時間は後で強化されたものを使用できます。

0 投票する
3 に答える
2997 参照

java - ブール論理ツリー評価の最適化

long[]配列内のビットとして保存された真/偽の結果がたくさんあります。私はこれらの膨大な数を持っています(何百万ものロング)。

たとえば、結果が 5 つしかない場合、次のようになります。

次のようなステートメントを表すツリーもいくつかあります。

木はとてもシンプルですが、とても長いです。それらは基本的に次のようになります (以下では、私が持っているものを示すために単純化しすぎています)。

基本的に、Node がリーフであり、条件番号 (long[] 配列のビットの 1 つに一致) を持つか、Node がリーフではないため、いくつかのサブノードを参照します。

シンプルですが、複雑なブール式を表現できます。それはうまくいきます。

これまでのところ、すべてがうまく機能しています。ただし、問題があります。多くの式を評価して、それらが真か偽かを判断する必要があります。基本的に、ブルートフォースよりも優れた解決策がわからない問題に対して、ブルートフォース計算を行う必要があります。

そのため、ツリーをたどってtruefalseツリーの内容とlong[].

最適化する必要があるメソッドは次のようになります。

ここで、最初の呼び出しでnodeは がルート ノードであり、次に明らかにサブノードです (再帰的であるため、そのsolveメソッドはそれ自体を呼び出します)。

少数の木 (おそらく最大で 100 程度) しかなく、何百万ものツリーlong[]をチェックすることを知っている場合、これを最適化するためにどのような手順を実行できますか?

明らかな再帰的な解決策は、パラメーター ((サブ) ツリーと long[]、パラメーターとして渡さないことで取り除くことができlong[]ます) を渡し、すべての再帰呼び出しなどで非常に遅くなります。 (AND または OR または NOT など) が使用され、非常に多くの if/else または switch ステートメントが含まれます。

私は別のアルゴリズムを探しているわけではありません (存在しません) ので、y が x よりも小さい O(x) から O(y) に移動することを探していません。

私が探しているのは、「x 倍」のスピードアップです。5 倍速く実行されるコードを記述できれば、5 倍のスピードアップが得られ、それで十分であり、非常に満足しています。

現時点で私が見ている唯一の拡張機能は、現在のものと比較して「x」倍の大幅な高速化になると思いますが、すべてのツリーのバイトコードを生成し、すべてのツリーのロジックをクラスにハードコーディングすることです。 . 100本ほどの木しかないので、うまくいくはずです(ただし、木は固定されていません。木がどのように見えるかを事前に知ることはできません。そうでなければ、すべての木を手動でハードコーディングするのは簡単です)。

すべてのツリーのバイトコードを生成する以外に何か考えはありますか?

バイトコード生成ルートを試してみたい場合は、どうすればよいですか?

0 投票する
2 に答える
571 参照

java - Asm バイトコード クエリ

こんにちは、ASM バイトコード Tree Api を使用して、クラスの静的分析を実行しようとしています。かなり基本的な質問があると思います。foob​​ar() というメソッドでは、foobar 内に命令のリストがあります (リストを持つ InsnList)。ここで、命令番号 10 で関数 "barfoo(String args)" が呼び出されているかどうかを確認したいと思います。

また、個別に、特定の命令が条件付きかどうかを確認する必要があります。

ありがとう、SJ

注: すでにクラスを読み取って、関心のある特定のメソッドに到達し、そのメソッドの各命令を反復処理できます。

解決済み (グレッグのコメントを参照):

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

java - 変数の定義と割り当てはasmバイトコードを検出します

Javaコードの静的分析にASMバイトコードツリーAPIを使用しようとしています。私はClassNodecn、MethodNode mを持っており、そのメソッドの命令のリストはInsnListlistと言っています。

与えられた命令(つまりAbstractInsnNode)について、上記の命令リストのsにある変数のすべての定義/割り当てを見つける必要があるとします。より明確にするために、変数varが2行目で定義および初期化され、8行目で他の値が割り当てられ、12行目で使用されているとします。この場合、12行目が私のです。また、その間の行に多くの条件付きコードがあると想定します。

これはASMで可能ですか?どのように??

よろしく、SJ

明確にするために、

ここで、条件付きがJumpInsnNode(現在の命令)であり、条件内の変数(この場合はv.rankとnumIter)のいずれかが上記のコードのどこかで変更または割り当てられているかどうか(およびどこで)を見つける必要があるとします。単純にしてください。メンバー変数だけです(静的関数や別のクラスの関数への委任はありません)。

0 投票する
2 に答える
301 参照

java - JVM のアセンブリ言語を標準の高レベル Java コードに統合することは可能ですか?

Java アセンブリ コード (Jasmin (Java のアセンブラー インターフェイス) を使用) を標準の Java コードとマージしようとしています。

これは可能ですか?

0 投票する
7 に答える
1617 参照

java - ソースのないコンパイル済み1.6Javaクラスの整数フィールドを変更する最良の方法

java 1.6設定でコンパイルされたクラスファイルには、より高い値に設定する必要がある2つのフィールドがあります。

残念ながら、私はもう正しいリビジョンのコードにアクセスできず、クラスファイルを提示するだけです。

これが私がすでに試したことです:私はBCEL、asm、javassistをいじくり回してきましたが、これは決して些細なことではないようです。適切なバイトコードエディタも見つかりませんでした(jbeは本当に混乱しているように見えますが、クラスエディタはIntegerオブジェクトの値を表示しません)。Eclipseバイトコードクラスのファイルビューアは、保存しようとするとひび割れます。16進エディタを使用して値を操作することは、現在よりも多くの桁を持つため、問題外です。また、javapを調べて、jasminで再コンパイルしました。これは不可能のようです。

それで、最終的に-お願いします、ああお願いします-誰かがこれが想像できる方法でどのように行われることができるか良い例を持っていますか?

0 投票する
3 に答える
5749 参照

c# - バイナリファイルの途中にバイトを挿入する

画像メタデータ ブロックの途中に文字列を追加したいと考えています。特定のマーカーの下。.NET はカスタム メタデータ フィールドをサポートしていないため、バイト レベルで行う必要があります。

ブロックは1C 02 XX YY YY ZZ ZZ ZZ ...、XX が追加する必要があるフィールドの ID、YY YY がそのサイズ、ZZ = データのように構築されます。

このマーカー (1C 02 XX) までのすべての画像データを読み取り、サイズ バイト (YY YY) を増やし、ZZ の最後にデータを追加し、元のファイルの残りを追加することは多かれ少なかれ可能であると思います? これは正しいです?

どうすればいいですか?4 ~ 5 MB の JPEG ファイルでできるだけ高速に動作する必要があります。

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

metadata - JPEGファイルサイズマーカー、バイトの挿入、IPTCメタデータ

IPTCフィールドをバイトレベルでJPGファイルに手動で挿入することに興味があります。JPEGファイルには、適切なサイズのマーカーを持つ複数のメタデータセグメントがあります。IPTCのセグメントコンテナは次のとおりです。

App13-で始まるFF ED XX XX ..

8BIMIPTCテキストメタデータ-で始まる38 42 49 4D 04 04 00 00 00 00 XX XX ..

IPTCフィールドは1C 02 50 XX XX ..(0x50 = 80、IPTCフィールド#80)で始まります。

(XX XX = 2バイトの長さ-言及されたセグメントデータのサイズを表すワード)。

JPEGファイルとメタデータに注意すべき他のサイズマーカーはありますか?カスタムIPTCフィールドを使用してメタデータセグメントを追加する場合、サイズを増やす必要がありますか?

すでにIPTCセグメントを含むすべてのJPEG画像で機能するカスタムメタデータフィールド(たとえば、#225)を追加するにはどうすればよいですか?

C#で作業していますが、バイトの操作に関する質問なので、言語は関係ないと思います。