4

だから私はJDIに身を投じようとしています。最初に VM コマンドでデバッグ対象を起動することで、デバッガ アプリケーションをデバッグ対象プログラムにフックすることに成功しました。

-agentlib:jdwp=transport=dt_socket,server=y,address=8000

次に、接続コネクタを使用して接続を確立するデバッガを起動します。

VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
AttachingConnector ac = vmm.attachingConnectors().get(0);
Map<String, Connector.Argument> env = ac.defaultArguments();
env.get("port").setValue("8000");
env.get("hostname").setValue("localhost");
VirtualMachine vm = ac.attach(env);

しかし今は、デバッガー アプリケーションでデバッグ対象プログラム自体を開始する必要があります。その場合、起動コネクタを使用する必要があることを理解しています。だから私はこれを試しました:

VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
LaunchingConnector lc = vmm.launchingConnectors().get(0);
Map<String, Connector.Argument> env = lc.defaultArguments();
env.get("main").setValue("p.DebugDummy");
env.get("suspend").setValue("true");
env.get("home").setValue("C:/Program Files/Java/jdk1.7.0_51");
VirtualMachine vm = lc.launch(env);

ただし、このアプリケーションを起動すると、デバッグ対象プログラムが起動しません。上記のコードのフォローアップ コードがたくさんあるにもかかわらず、例外も何も発生しません。次のようなもの:

    // A single implementor of this interface exists in a particuar VM
    EventRequestManager mgr = vm.eventRequestManager();

    // suspend VM
    vm.suspend();

    // lookup main thread
    ThreadReference mainThread = null;
    List<ThreadReference> threads = vm.allThreads();
    for (ThreadReference thread : threads) {
        if ("main".equals(thread.name())) {
            mainThread = thread;
            break;
        }
    }

    // resume 
    vm.resume();
    mainThread.resume();

    // There is one instance of EventQueue assigned to a particular
    // VirtualMachine.
    EventQueue eventQueue = vm.eventQueue();

    // Waits for start event.
    WAIT_FOR_START: do {
        EventSet eventSet = eventQueue.remove();
        EventIterator eventIterator = eventSet.eventIterator();
        while (eventIterator.hasNext()) {
            Event event = eventIterator.next();
            if (event instanceof VMStartEvent) {
                System.out.println("VMStartEvent.");
                break WAIT_FOR_START;
            }
        }
    } while (true);

    System.out.println("GO...");

それはすべて正常に実行されますか?! 例外は発生せず、すべての sysouts (GO... など) が発生します。これは非常に奇妙だと思います。明らかに、メイン スレッドと VMStartEvent が検出されます。しかし、私のデバッガーはこれをすべてそれ自体または何かに対して行っていると思いますか? 残念ながら、これらすべてのメソッド呼び出しが何をするのか、よく理解していませんでした。

私の質問: デバッグ対象プログラムが起動しないのはなぜですか?

上記のように、「メイン」引数を次のように設定しました。

env.get("main").setValue("p.DebugDummy");

私のデバッガー アプリケーションは、同じパッケージ (p) にあります。それで、それは正しいはずですか?しかし、明らかに私はここで何か間違ったことをしています。何か案は?

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

4

2 に答える 2