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