所以,我正在启动一个Java程序,如下所示
java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass
然后我手动附加一个调试器,如下所示
jdb -attach 8000
我想知道是否有任何方法让我设置 jdb 以便在未捕获异常的情况下(仅)自动附加到正在运行的进程?
原因是我想避免调试器的开销,直到出现未捕获的异常。但是我现在面临的问题是,如果没有附加调试器,那么一旦出现未捕获的异常,JVM 就会中止。
编辑:
从 Oracle docs看来,以下命令可以满足我的需要,但适用于 Windows 机器。
java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
有谁知道linux的等价物吗?我已经尝试了以下命令。
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
调试器似乎已连接,但它立即抛出 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)