2

JVM のより深い層とそのデバッグ機能に問題があります。私がやろうとしているのは、ProcessBuilder を使用して別の Java プログラムを開始し、それをメイン プロセスと通信させることです。コマンドを追加しない限り、すべて正常に動作します

"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044",

ProcessBuilder に。

Class toExecute = ExampleSimulationController.class;
String javaHome = System.getProperty("java.home");
String javaBin = javaHome
        + File.separator + "bin"
        + File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = toExecute.getCanonicalName();

ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp",
        "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044",
         classpath, className);
builder.redirectErrorStream(true);

この行を ProcessBuilder に追加すると (たとえば、ここで説明されているようにサブプロセスにデバッグ機能を追加する意図があります: What are Java command line options to set to allow JVM to be remote debugged? 読み込もうとすると例外が発生します)次のように:

BufferedReader mainProcessConsoleOutput = new BufferedReader(new InputStreamReader(mainSimulation.getInputStream()));

さらに下:

if(!(line = mainProcessConsoleOutput.readLine()).equals("someText"))

例外は次のとおりです。

Main Process: Exception in thread "main" java.lang.NoClassDefFoundError: /Users/...[path].../build/classes
Main Process: Caused by: java.lang.ClassNotFoundException: .Users.[same_Path].build.classes
Main Process:   at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
Main Process:   at java.security.AccessController.doPrivileged(Native Method)
Main Process:   at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
Main Process:   at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
Main Process:   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
Main Process:   at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Exception in thread "main" java.lang.NullPointerException
at [PacketStructure].SimulationController.main(SimulationController.java:66)

私はNetbeansをIDEとして使用しており、「デバッガーのアタッチ」について知っており、ProcessBuilderに渡すコマンドで指定したのと同じポートを与えています。ただし、サブプロセスでブレークポイントを指定する前に、いつこれを行う必要があるかわかりません。その後?これまでのところ、サブプロセスがデバッガーと通信していることを示す兆候は見つかりませんでした。

私にも疑わしいと思われるのは、サブプロセスのストリームから読み込もうとすると例外がスローされるという事実です-以前のどこかではありません。

ObjectInputStream と ObjectOutputStream を使用してシリアル化されたデータをあるプロセスから別のプロセスに渡しますが、サブプロセスをデバッグできないため、それが問題の潜在的な原因であるかどうかはわかりません。

私はMacOSを使用しています。

この問題の解決策は Java Magic に関する私の知識を超えているため、このなぞなぞを解決するのを手伝ってください。

ありがとう、

M

4

2 に答える 2

2

クラスパス値は、クラスパス引数の直後に続く必要があります。

于 2013-02-17T15:50:40.343 に答える
2

問題を解決するために多くの時間を費やした後、私はついにやった:

ProcessBuilder builder = new ProcessBuilder(javaBin,"-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=n,suspend=y","-cp", classpath, className);

「-agentlib」コマンドの後に「-cp」コマンドを追加すると、明らかにクラスパスが正しく className と一致します。

コマンドが渡される順序が重要であることを知っておく必要がありましたか?

どうも

于 2013-02-17T09:50:01.360 に答える