Command-line debugging with Java

Steps to debug Java apps in stone-age style:

  1. Run your program with additional switches
    java -Xdebug -Xrunjdwp:transport=dt_shmem,server=y,address=MyAppName,suspend=n -cp . test
  2. Run the command line debugger
    bin/jdb.exe -connect com.sun.jdi.SharedMemoryAttach:name=MyAppName
  3. Tell the debugger where the sources are
    sourcepath C:/Cygwin/Home/Chui
  4. 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

Leave a Reply