您的位置:首页 > 移动开发 > Android开发

Android下的JDB调试

2012-03-28 14:17 246 查看
原文地址: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查看。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: