Android下的JDB调试

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

 

 

你可能感兴趣的:(Android下的JDB调试)