用"jdb -attach"(或jswat)调试android应用程序

Giu*_*cio 9 debugging jdb android-emulator

我在使用模拟器上的Android应用程序的独立java调试器时遇到了麻烦.显然,任何具有远程功能的java调试器(如jdb(或jswat))都可以通过以下步骤进行操作(正如我在此处阅读后所理解的那样):

1)打开模拟器,在模拟器上安装您的应用程序(adb install)

2)打开dalvik服务器(ddms)

3)在模拟器上,运行"DevTools"应用程序 - >"开发设置" - >选择要调试的应用程序,启用"等待调试器"标志

4)再次在模拟器中运行你的应用程序; 它将阻塞,等待调试器附加,dalvik将显示一个由"红色bug"标记的新进程

5)在dalvik上,选择红旗过程; 因此,它的调试端口转发到localhost:8700

6)将调试器挂钩到localhost:8700.使用jdb,你必须运行"jdb -attach 8700"

启动调试器后,模拟器上的应用程序将解锁.因此,似乎应用程序已正确检测到调试器,因此可以自由运行.

然而,重点是它"自由运行",也就是说,它不会等待调试器发出"运行"命令.所以我没有机会设置任何断点.

根据1的提示,我已经尝试在我的应用程序的开头放置等待循环,希望我有时间设置断点.当我尝试设置断点时,jdb会说"延迟断点XXX.YYY.它将在加载类后设置.",因为应用程序尚未运行.但是,如果我然后发出"运行"命令,答案是"没有暂停.",因为应用程序已经运行(确实如此).

使用jswat你没有看到这些消息,但最终的结果是相同的:-(

不用说,"jdb -attach"适用于在localhost上运行的非android java应用程序.

任何提示("请使用eclipse"除外)?

我在任何地方都错过了一个愚蠢的细节吗?

该应用程序是一个HelloWorld,构建命令是"ant debug".

先感谢您.

Bri*_*Onn 5

最好的方法似乎是在.jdbrc文件中设置断点,因为它们是加载和延迟的,您不必更改代码来设置任意延迟循环,试图在等待时捕获调试器.我和你一样,发现如果在类名上设置断点,它就不起作用.它说延迟直到加载类,但是当加载类时,似乎jdb永远不会得到通知.

但是,如果在特定类和行号处设置断点,它确实有效

在.jdbrc文件中:

stop in com.android.helloandroid.HelloAndroid
stop at com.android.helloandroid.HelloAndroid:21

正如您所知,第一行没有任何作用.第二行在这里适合我:

Initializing jdb ...
*** Reading commands from /home/codeboy2k/.jdbrc
Deferring breakpoint com.android.helloandroid.HelloAndroid.
It will be set after the class is loaded.
> Deferring breakpoint com.android.helloandroid.HelloAndroid:21.
It will be set after the class is loaded.
> > Set deferred breakpoint com.android.helloandroid.HelloAndroid:21

Breakpoint hit: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11

 main[1] 

所以关键似乎是在断点中使用特定的行号.试一试.希望它能帮助你并为你工作.