問題タブ [jdi]
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 - VMStartEvent 後に Java VM がハングする
VMStartEvent 仮想マシンがこの行でハングアップした後
VM は で起動されsuspend = false
ます。私はJava 1.7を使用しています
java - Java リフレクションと Java Debug Interface (JDI) の比較
Java Reflection と Java Debug Interface の使用の違いは何ですか? いつ一方を使用でき、いつもう一方を使用できますか?
java - ある状況で JDI がハングアップする
私は JDI を使用していますが、com.sun.jdi.VirtualMachine#dispose の呼び出しが何らかの状況でハングすることがわかりました。
スレッド スタックは次のとおりです。
逆コンパイルされたコードから、私はこれを見ました:
ここでデッドロックが発生しているようですが、これは JDK のバグですか? Hotspot JDK 7 を使用しています。
Java バージョン "1.7.0_79" Java(TM) SE ランタイム環境 (ビルド 1.7.0_79-b15) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 24.79-b02、混合モード)
jdi - 実行前にブレークポイントを設定する方法
アプリケーションが起動時にブレークポイントを渡さないように、実行を開始する前にアプリケーションにブレークポイントを設定したいと考えています。
ブレークポイントを設定するには、次のようにする必要があります。
ブレークポイントの場所を取得するには、次のようにします。
メソッドを取得するには、次のようにします。
ただし、そのclassTypeを取得するには、実行中のJVMが必要と思われるObjectReferenceが必要なようです。
アプリケーション JVM が実行される前にブレークポイントを設定して、アプリケーションの起動中にブレークポイントが渡されないようにする方法はありますか?
javascript - JDI によるソースコード
Javaデバッグインターフェースを使用してNashornエンジンをプログラムでデバッグしようとしています。スタック フレームを取得jdk.nashorn.internal.scripts.Script$Recompilation$1$23A$\^eval\_
し、このフレームでソースの場所を表示できます。しかし、実行中の JavaScript ソース コードをロードしたいのですが、その方法がわかりません (JS ファイルがなく、直接eval
呼び出しによってエンジンにコードがロードされました)。私は、NetBeans が JavaScript をデバッグし、Nashorn から JS コードを抽出できることを知っています。使う魔法は?
java - Java: メソッドのフックとオブジェクト インスタンスの検索
状況
こんにちは、2 つの問題があります。
状況は、プロセスにコードを挿入してターゲットを操作するためのツールも提供するWindows 用の Java API を作成していることです。たとえば、jar を別の jar に注入するなど、すでにInjection-partを実装しています。この時点で、私の jar が呼び出され (ターゲットがすでに実行中に)、完全な静的コンテキストで開始されます。
目標と問題
ここから、2 つの目標があります。
- ターゲット オブジェクトとやり取りしたいので、参照が必要です。多くのオブジェクトでは、インスタンスへの静的アクセスを提供しているため、これはすでに可能です。たとえば、awt.Frames#getFrames()は、作成されたすべての Frame オブジェクトへのアクセスを提供します。しかし、ヒープ上の任意のオブジェクトにアクセスできる可能性があれば素晴らしいことです。「 Heap#getAllObjectInstances() 」のようなもの。
- オブジェクト インスタンスが与えられたら、このオブジェクトの任意の関数に接続したいと思います。たとえば、BufferStrategy#show()が呼び出されるたびに、最初に別のメソッドを呼び出すようにします。
そこで、問題点を次のようにまとめます。
- 静的コンテキストから任意のオブジェクト参照を取得するには?
- 任意の関数に接続する方法は?
備考
私がこれまでに行ったこと、発言、アイデア:
- JDI (Java Debugger Interface) は、VirtualMachine#allClasses() -> ReferenceType#instances(0)を介してそのようなメソッドを提供します。しかし、JDI では、追加のデバッグ パラメータを使用してターゲット JVMを開始する必要がありますが、これはオプションではありません。低レベルに降りてメモリツールでヒープを分析することもできますが、誰かがより高レベルのアプローチを知っていることを願っています. 私はJNA/JNIに精通しているので、Windows API を使用することも選択肢の 1 つですが、そのようなツールは知りません。
- 最後の手段は、非常に低レベルのアプローチである C コードでIAT フックを使用することです。これは避けたいと思います。この時点でオブジェクト参照があると想定できるので、Reflection APIはオブジェクト メソッドを変更するメソッドを提供するのでしょうか? または、少なくとも単にフックメカニズムを提供しますか?
対象となるコードを変更することは、私にとって選択肢ではないことに注意してください。そして、それはすでに実行時であるため、ByteCode-Manipulation もオプションになる可能性があります。
シナリオ
これが役立つシナリオ:
ターゲットは、jar としてデプロイされたgameです。BufferStrategyクラスを使用して、 Double-Buffer-Strategyでレンダリングします。BufferStrategy#show()で画像を表示します。ゲーム内に jar を挿入し、追加情報を含むオーバーレイを描画します。このために、使用されているBufferStrategyへの参照を取得し、そのshowメソッドに接続します。drawOverlay -methodが呼び出されるたびに呼び出されるように、元のshow-methodに戻します。
java - 独自のデバッガ インターフェイスに接続する Java プロセス
Java プロセス内で、同じプロセスの JDI (Java Debugging Interface) にアクセスしたいと考えています。
私は次の仮定をします:
- プロセスはデバッガー内で実行されています (Intelli/J)
- Oracle JVM 8 を使用しています
- Linuxを実行しています(移植性は必要ありません)
つまり、私は次のようなことをしたいです:
(もちろん、そのようなオブジェクトがないことを除いて。)
自分の VM に接続するにはどうすればよいですか?
なぜ私はそれが欲しいのですか?
一意の IDfindObj
を介してオブジェクトを検索する関数を作成したいと考えています。たとえば、Intelli/J デバッガーで変数 " " が表示された場合、オブジェクトを検索して返すウォッチ式 " " を追加できるようにしたいと考えています。そうすれば、変数が変更された後、または現在のスタック フレームを離れた後でも、オブジェクト #1234 を見ることができます。x = {Something@1234}
findObj(1234)
x
現在のプロセスの JDI にアクセスできるようになれば、この機能を実装できると思います。
[編集:質問には答えませんが、私のユースケースは解決します:Intellij/Jでは、オブジェクトを「マーク」し、これらのマーカーをウォッチ式で使用できます。]
私は何を試しましたか?
デバッグ セッションで Java プロセスを開始するときに Intelli/J が引数で指定するホスト名とポートを使用して、SocketAttach AttachingConnector経由でプロセス自体に接続しようとしました。(ここで-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:39469,suspend=y,server=n
説明されている方法に大まかに従っています。)私は得ます:
おそらく、Intelli/J が既に接続されていて、そのポートに 2 回接続できないためでしょうか? [編集: Intellij/J はserver=n
、プロセスが接続を行うことを意味するパラメーターを使用して jwdp エージェントを開始します。したがって、接続は拒否されました。しかし、さらなる実験では、 を使用したとしてもserver=y
、せいぜい 1 つの接続しか受け入れられないことが示されています。]
別のアプローチは、 ProcessAttach AttachingConnectorを使用することでした。その場合、私は得ました:
java - Tools.jar を Maven Central にアップロードできますか?
私のアプリケーションは、 にある JDI デバッガー クラスを使用しますtools.jar
。を使用してアプリケーションをスタンドアロンとしてパッケージ化しますMaven
(つまり、.xml を作成しますfoo-with-dependencies.jar
)。
ただし、tools.jar
Maven Central にはありません。
スタックオーバーフローで一般的なソリューションは有効ではありません。<scope>system</scope>
tools.jar
foo-with-dependencies.jar
Maven セントラルに tools.jar がないのはライセンス上の理由がありますか? にアップロードできますtools.jar
かMaven Central
?