Więc ja rozpoczynam program Java, jak poniżejAttach JDB na nieprzechwyconego wyjątkiem
java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass
Następnie ręcznie dołączyć debugger jak poniżej
jdb -attach 8000
chciałbym wiedzieć, czy istnieje w każdym razie dla mnie skonfigurować jdb tak, aby automatycznie przyłączał się do działającego procesu (tylko) w przypadku nieprzechwyconego wyjątku?
Powodem jest to, że chciałbym uniknąć obciążenia debuggera, aż pojawi się nieprzechwycony wyjątek. Problemem, z którym teraz borykam się, jest to, że jeśli debugger nie jest podłączony, wówczas JVM przerwie się, gdy pojawi się nieprzechwycony wyjątek.
EDIT:
Od Wyroczni docs wydaje polecenie poniżej robi to, co muszę, ale dla komputerów z Windows.
java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
Ktoś zna odpowiednik linuksa? Próbowałem polecenia poniżej.
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
Debugger wygląda na to, że łączy się, ale natychmiast rzuca 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)
Cóż, chcę analizować wartości zmiennych na stosie w momencie awarii programu. Nie sądzę, że mogę to zrobić z UncaughtExceptionHandler, ponieważ stos rozwinie się, gdy wyjątek przejdzie w górę? – nave
Dlaczego nie ustawić warunkowego punktu przerwania na module obsługi wyjątku? W ten sposób uzyskasz wyjątek, a punkt przerwania pozwoli ci przejrzeć stos wywołań. –
Tak więc, jak rozumiem, kiedy wyjątek jest rzucany od, powiedzmy, metodę B, stos wywołań dla metody jest niszczony, a wyjątek jest rzucany w górę. To się toczy, aż w końcu wyjątek dotrze do UncaughtExceptionHandler. Ale do tego czasu stos wywołań metody, w której wystąpił wyjątek (i którego zmienne lokalne chcę wyświetlić) już nie istnieje. Czy warunkowy punkt przerwania nie pomoże? Daj mi znać, jeśli coś jest nie w porządku z moim zrozumieniem ... – nave