2

I am having trouble with the deeper layers of the JVM and its debugging functionality. What I am trying to do is start a separate java program using ProcessBuilder and let it communicate with my main process. All works fine unless I add the command

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

to the 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);

In adding this line to the ProcessBuilder (with the intention to add debugging functionality to the subprocess as described, for example, here: What are Java command line options to set to allow JVM to be remotely debugged? I get an exception when trying to read as follows:

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

and further down:

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

The exception is as follows:

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)

I am using Netbeans as IDE and know about "Attaching a Debugger" and giving it the same port as specified in the command I pass to the ProcessBuilder. However, I don't know when I have to do this - before I specify a breakpoint in the subprocess? Afterwards? So far I did not find any indication that my subprocess is communicating with a debugger in any way.

What seems suspicious to me as well is the fact that the exception is thrown when I try to read from subprocess' stream - and not someplace earlier.

I do use ObjectInputStream and ObjectOutputStream to pass serialized data from one process to the other, but since I cannot debug the subprocess I don't know if that is a potential source of the problem.

I use MacOs.

Since the solution of this problem lies beyond my knowledge of the Java Magic, please help me in solving this riddle.

Thanks,

M

2 Answers 2

2

The classpath value must immediately follow the classpath argument.

Sign up to request clarification or add additional context in comments.

Comments

2

After a lot of time spent trying to solve the problem I finally did:

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

By adding the "-cp" command after the "-agentlib" command apparently the classpath is matched correctly with the className.

Should I have known that the order in which commands are passed is important?

Thx

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.