問題タブ [attach-api]
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 - AttachApiの使用中にエラーが発生しました
EclipseでアタッチAPIを使用していると、コンソールでエラーがスローされます。
attach APIを使用するために、EclipseにインストールされたJREに移動し、編集オプションを使用して、現在のJREの外部jarオプションにtools.jarを含めました。
しかし、次のような単純なプログラムを実行しようとすると、次のエラーがスローされます
java.lang.UnsatisfiedLinkError:java.library.pathにアタッチがありませんcom.sun.tools.attach.AttachNotSupportedException:dynamicLoadingTest.VMAttachのcom.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:190)にプロバイダーがインストールされていません.main(VMAttach.java:17)
これは実行される単純なプログラムです。インポートjava.io.IOException;
言及されているプロセスID6832は、システム上で実行されているJavaアプリケーションのものです。
インストールされているjreをjdkに変更すると、次のエラーが発生します
java - すでに実行中の VM インスタンスに Java エージェントを接続する方法
attach API を使用して、実行中のJavaインスタンスにJava エージェントを接続しようとしています。私が得ている問題は、Windows タスク マネージャーで既に実行中の Java プロセスのプロセス ID を確認し、それを Java エージェントを接続するプログラムにハード コードする場合です。何も起こりません。すでに実行中のプロセスに Java エージェントをアタッチできないようにするためですか。
動的エージェントの読み込みチュートリアルを実行しましたが、問題なく動作しますが、唯一の問題は、VMインスタンスを検出し、それにJava エージェントを動的にアタッチすることです。このインスタンスは、そうするための現在のプログラムが起動されているものに他なりません。
ここでの要件は、 JMonitorやその他の分析ツールが行うように、すでに実行中のVMインスタンスに Java エージェントをアタッチすることです。どのように進めるか、親切に指示を出してください。
java - アタッチ ライブラリ DLL をアプリケーションでロードできません
私はJavaでバイトコード操作を行っていますが、外部の実行中のJARファイルで行われています。このため、アタッチ API を使用しています。
私の現在の問題は、別のフォルダーにある DLL をアタッチ API が読み込めないことです。以前にファイルの場所に問題がありましたが、それらを修正したので、ファイルを表示できることはわかっていますが、ロードできないだけです。
私のスタックトレースは次のとおりです。
そして、ここに私のソースコードがあります:
java - Byte Buddy を使用して実行中の SpringBoot アプリケーションをインストルメント化すると、IncompatibleClassChangeError が発生する
Byte Buddy を会社に紹介したいと思い、同僚向けのデモを用意しました。Spring をよく使うので、SpringBoot アプリケーションのインストルメンテーションが最も良い例だと思いました。ログを RestController メソッドに追加することにしました。
インストルメント化されたアプリケーションは、単純な SpringBoot Hello World の例です。
そして、これが私の Byte Buddy エージェントです。
インターセプターはメソッドの実行を記録します:
-javaagent パラメータを指定して実行すると、この例はうまく機能します。ただし、Attach API を使用して実行中の JVM にエージェントをロードしようとすると、次のようになります。
最初のロギング試行で次の例外が発生しました。
Java8 を使用して 64 ビット HotSpot で例を実行します。
Byte Buddy のバージョンは 1.4.32 です。エージェント Maven の設定は次のとおりです。
インストルメント化されたアプリケーションの pom ファイルは次のとおりです。
私の観点からは、実行中のサーバーにログを追加することは非常に価値のあるオプションであり、デモのこの部分を失うのは嫌いです. さまざまな再定義戦略を試してみましたが、今のところ何もうまくいかないようです。
instrumentation - Java - bytebuddy エージェントはクラスを「完全に」再定義できますか?
byte-buddy エージェントは、「新しいメソッド定義」、「静的変数の変更」などの Attach API の制限を克服できますか? メソッドが Agent Builder から呼び出されていることはわかりますがredefineClasses
、これもアタッチ API と同じ制限に従っているかどうかはわかりません。
次のことができるかどうかを理解しようとしています。
1) などのアプリケーション クラス ローダーを使用してエージェント jar をロードしますParallelWebappClassLoader
。私のアプリケーションはサーブレット webapp であり、実行時に上記のクラスローダーを使用してすべてのアプリケーション クラスをロードします。
2)クラスを完全に再定義します。つまり、メソッドの追加/更新と静的/ローカル変数の変更/更新/追加です。
現在、Attach API の制限内で動作するエージェントがありますが、システム クラス ローダーからアプリケーションへのクラスの読み込みを委任するのに苦労しています。
どうもありがとう、
java - OpenJDKで実行時にJavaエージェントをロードしますか?
VirtualMachineVirtualMachine#loadAgent
クラスがどこにもないことを除けば、正直なところ素晴らしいと思います。私もそれについてかなり混乱していますが、Attach API を持っていないようです。私はOpenJDK 8を使用しています:
Java エージェントをロードするには、他にどのような方法がありますか? 私が取り組んでいる環境では-javaagent:
、実行時にクラスパスに挿入されることを意図しているため、引数を渡すことにほとんど成功しません。明らかに、平均的なユーザーは、JVM引数を手動で変更することを望んでいない/知識を持っていません。私の特定のプログラムのために。
別の注意として、このクラスが OpenJDK の一部であることを意図していることを確認するために、Java ホットスポット VM 用にのみ設計されたものではないため、 http: //hg.openjdk.java.net/ から OpenJDK コードをダウンロードしました。、そしてVirtualMachine.javaファイルを見つけました。これは、間違いなく存在することを意味します