So, I am starting a Java program as below
java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass
I then manually attach a debugger as below
jdb -attach 8000
I would like to know if there is anyway for me to set up jdb so that it automatically attaches to the running process (only) in the case of an uncaught exception?
The reason being that I would like to avoid the overhead of the debugger until an uncaught exception arises. But the problem I face now is that if the debugger is not attached, then the JVM aborts once an uncaught exception arises.
EDIT:
From the Oracle docs, it seems the below command does what I need, but for windows machines.
java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
Anyone knows the linux equivalent? I have tried the below command.
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
The debugger seems like it connects but it immediately throws an IOError.
Initializing jdb ...
java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.sun.tools.example.debug.tty.TTY.<init>(TTY.java:751)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1067)
To attach a debugger just in time does indeed use the options you suggest (
launch
andonuncaught
). But the launch option needs more on linux:In your case, jdb is failing to open the terminal
TTY
it needs because of the context it is being started in. Depending on the environment where this is running, you will need to construct a script that launches jdb in a new window or attaches it to a pseduo-tty so that it can run properly.I tested this by creating a script that uses screen to start the terminal
This script will start
jdb
in a detached screen and name the session for the screenautojdb
. You can see the list of your screens usingscreen -ls
. When you want to access the debugger that has been started usescreen -r autojdb
. Make sure to put the script in your path or give the full path (/home/me/screenjdb
below) in your launch option:In my script I also passed
-L
to screen which logs the session. This will record the session but also let you see any errors that occurred if the attach fails for some reason.Instead of using a debugger and attaching one remotely, why don't you create an uncaught exception handler using
Thread.UncaughtExceptionHandler
?