我遇到了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魔法的知识,请帮助我解决这个谜题。
感谢,
中号