JDB – lessünk JAVA programot

Ma a szükség úgy hozta, hogy egy JAVA programot kellett debug-olnom, mert sehogy sem akarta azt csinálni, amit vártunk tőle.

Az OSX-ben megbújó JDB (This is jdb version 1.5 (J2SE version 1.5.0_07)) eszközt használtam. Két részre kellett bontani a figyelést, egyrészt a JAVA VM-nek meg kell mondani, hogy legyen kész a debugger kiszolgálására. Ezt úgy teszi, hogy egy TCP portra ül, és ott várja a debugger csatlakozását.

# start example.java class in debug ready mode
java -Xdebug \
-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \
example.java

louise$ ./start-debug
Listening for transport dt_socket at address: 8000
App status change: 1 Status text: Waiting for start…

louise$ jdb -attach 8000
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb …
>

Másrészt, ha sikeresen csatlakozott a JDB a 8000-es porton a szerverként üzemelő JAVA VM-hez, a következő lépés, hogy megtudjuk tőle, vajon most mit is csinál az adott program.

Ehhez először meg kell állítani a futását a “suspend” paranccsal:

> suspend
All threads suspended.

Ekkor az összes futó thread megáll, a program az operációs rendszer felé semmilyen interakcióval nem bír, windows-os nyelven homokórázik, mac-es nyelven pörgeti a strandlabdát… :)

Ha áll a program, meg lehet tőle kérdezni, hogy éppen milyen függvény végrehajtásával van elfoglalva, erre a “where” parancs hivatott:

> where all
Signal Dispatcher:
Finalizer:
[1] java.lang.Object.wait (native method)
[2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:116)
[3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:132)
[4] java.lang.ref.Finalizer$FinalizerThread.run (Finalizer.java:159)
Reference Handler:
[1] java.lang.Object.wait (native method)
[2] java.lang.Object.wait (Object.java:474)
[3] java.lang.ref.Reference$ReferenceHandler.run (Reference.java:116)
main:
[1] org.eclipse.swt.internal.carbon.OS.ReceiveNextEvent (native method)
[2] org.eclipse.swt.widgets.Display.sleep (Display.java:3,796)
[3] application.PCAppAuto.main (PCAppAuto.java:35)

A továbblépésben a “man jdb” vagy a SUN oldalán megbújó link segíthet…

Leave a Reply

Your email address will not be published. Required fields are marked *