原文地址:http://blog.csdn.net/ariesjzj/article/details/7399249
第一步在$HOME/.jdbrc裡設斷點,如:
stop in com.almalence.hdr.MainScreen.FindExpoParameters
第二步讓程式在啟動時停止等待jdb:
Dev Tools -Development Settings -> 選中要調的程式後點wait for debugger。
(具體可參見http://blog.csdn.net/ariesjzj/article/details/7393573)
註:以上這兩步不是必須的,只有在程式一起來就掛掉的情況下才用到,否則等程式啟動起來也來得及attach上去和設斷點。
第三步啟動DDMS,這時程式前面應該有個紅色小蟲,點上面的開始調試按鈕。這步不是必須的,這步的工作其實相當於手動敲:
$ adb -d forward tcp:8700 jdwp:$PID
其中$PID為要調程式的進程號。
第四步啟動jdb用戶端:
zjin@zjin-desktop:~/debug$ jdb -attach localhost:8700
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
*** Reading commands from /home/zjin/.jdbrc
Deferring breakpoint com.almalence.hdr.MainScreen.FindExpoParameters.
It will be set after the class is loaded.
> > Set deferred breakpoint com.almalence.hdr.MainScreen.FindExpoParameters
Breakpoint hit: "thread=<1> main", com.almalence.hdr.MainScreen.FindExpoParameters(), line=1,124 bci=0
<1> main[1] where
[1] com.almalence.hdr.MainScreen.FindExpoParameters (MainScreen.java:1,124)
[2] com.almalence.hdr.MainScreen.setupCamera (MainScreen.java:889)
[3] com.almalence.hdr.MainScreen.surfaceChanged (MainScreen.java:579)
[4] android.view.SurfaceView.updateWindow (SurfaceView.java:544)
[5] android.view.SurfaceView.access$000 (SurfaceView.java:81)
[6] android.view.SurfaceView$3.onPreDraw (SurfaceView.java:169)
[7] android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:590)
[8] android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1,620)
[9] android.view.ViewRootImpl.handleMessage (ViewRootImpl.java:2,446)
[10] android.os.Handler.dispatchMessage (Handler.java:99)
[11] android.os.Looper.loop (Looper.java:137)
[12] android.app.ActivityThread.main (ActivityThread.java:4,424)
[13] java.lang.reflect.Method.invokeNative (native method)
[14] java.lang.reflect.Method.invoke (Method.java:511)
[15] com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:785)
[16] com.android.internal.os.ZygoteInit.main (ZygoteInit.java:552)
[17] dalvik.system.NativeStart.main (native method)
<1> main[1]
常用命令:
threads:列出所有線程,然後就可以用thread命令選線程來調了。
where:相當於gdb的bt,顯示函數調用棧。
up, down:在函數調用棧中上一層和下一層。
monitor:每次停止時執行的命令。如monitor locals後每一次執行next就可以自動打出局部變數。
locals:列出局部變數
classes:列舉當前已知的類。
next ,step什麼的和gdb裡一樣。
suspend, resume:線程的suspend和resume,需要加線程號為參數。
set,print:設定,輸出運算式的值。
methods, fileds:列舉類的方法和成員變數。
catch, watch:跟異常和資料的變化,和gdb裡差不多。
trace:跟蹤函數的進出。不用在函數頭尾手動加printf了。
cont:斷點後繼續執行。
還有很多其它命令可在提示符下打help查看。