簡體   English   中英

Java ProcessBuilder調試器Netbeans

[英]Java ProcessBuilder Debugger Netbeans

我在JVM的更深層及其調試功能方面遇到麻煩。 我想做的是使用ProcessBuilder啟動一個單獨的Java程序,並使其與我的主進程通信。 除非我添加命令,否則一切正常

“-agentlib:JDWP = =運輸dt_socket,服務器= Y,暫停= Y,地址= 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中時(例如,打算在子進程中添加調試功能,例如,在這里:設置哪些Java命令行選項以允許對JVM進行遠程調試?嘗試讀取時出現異常)如下:

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將序列化的數據從一個進程傳遞到另一個進程,但是由於無法調試子進程,因此我不知道這是否是問題的潛在根源。

我使用MacO。

由於此問題的解決方案超出了我對Java Magic的了解,因此請幫助我解決這一難題。

謝謝,

中號

經過大量時間嘗試解決問題后,我終於做到了:

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

通過在“ -agentlib”命令之后添加“ -cp”命令,顯然可以將classpath與className正確匹配。

我是否應該知道傳遞命令的順序很重要?

謝謝

classpath值必須緊隨classpath參數之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM