原文地址: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查看。