2

我遇到了JVM及其调试功能的更深层次问题。 我所试图做的是使用的ProcessBuilder启动单独的Java程序,让它与我的主要进程进行通信。 “:JDWP = =运输dt_socket,服务器= Y,暂停= Y,地址= 1044 -agentlib”,Java ProcessBuilder调试器Netbeans

到的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 remotely 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的从一个进程传递序列化的数据给对方,但因为我不能调试子进程,我不知道这是否是问题的一个潜在来源。

我使用的Mac系统。

由于这个问题的解决方案超出了我对Java魔法的知识,请帮助我解决这个谜题。

感谢,

中号

回答

2

类路径值必须紧跟在类路径参数。

2

经过大量的时间花在试图解决这个问题我终于做到:

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

通过了“-agentlib之后增加 “-cp” 命令“命令显然,类路径与className正确匹配。

我应该知道命令传递的顺序很重要吗?

THX