Command-line debugging with Java
Friday, 30 March 2007
Steps to debug Java apps in stone-age style:
- Run your program with additional switches
java -Xdebug -Xrunjdwp:transport=dt_shmem,server=y,address=MyAppName,suspend=n -cp . test - Run the command line debugger
bin/jdb.exe -connect com.sun.jdi.SharedMemoryAttach:name=MyAppName - Tell the debugger where the sources are
sourcepath C:/Cygwin/Home/Chui - Show list of threads, suspend the threads, display call stack, and step through code
$ bin/jdb.exe -connect com.sun.jdi.SharedMemoryAttach:name=MyAppName Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb ... > threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x14e Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x14f Finalizer cond. waiting (java.lang.Thread)0x150 Signal Dispatcher running (java.lang.Thread)0x151 Attach Listener running Group main: (java.lang.Thread)0x1 main running > thread 1 main[1] suspend 1 main[1] where [1] java.io.FileInputStream.readBytes (native method) [2] java.io.FileInputStream.read (FileInputStream.java:199) [3] java.io.BufferedInputStream.read1 (BufferedInputStream.java:256) [4] java.io.BufferedInputStream.read (BufferedInputStream.java:317) [5] sun.nio.cs.StreamDecoder.readBytes (StreamDecoder.java:264) [6] sun.nio.cs.StreamDecoder.implRead (StreamDecoder.java:306) [7] sun.nio.cs.StreamDecoder.read (StreamDecoder.java:158) [8] java.io.InputStreamReader.read (InputStreamReader.java:167) [9] java.io.BufferedReader.fill (BufferedReader.java:136) [10] java.io.BufferedReader.readLine (BufferedReader.java:299) [11] java.io.BufferedReader.readLine (BufferedReader.java:362) [12] test.getName (test.java:10) [13] test.main (test.java:21) main[1] step > Step completed: "thread=main", test.getName(), line=10 bci=22