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

时间:2010-10-12 09:46:15

标签: debugging android-emulator jdb

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

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

2)打开dalvik服务器(ddms)

<3>在模拟器上运行“DevTools”应用程序 - &gt; “开发设置” - &gt;选择要调试的应用程序,启用“等待调试程序”标志

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”。

提前谢谢。

4 个答案:

答案 0 :(得分: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] 

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

答案 1 :(得分:0)

是的,它有效:-)非常感谢,codeboy2k!

我还做了更多实验,如果你指定一个方法名称(例如“在com.android.helloandroid.HelloAndroid.onCreate中停止”),它似乎也有效。 因此,关键技巧是在jdb的启动文件中放置一个初始断点,因此app应该在该断点处阻塞,然后继续实际的调试会话。

我也尝试过jswat,正确的程序如下:加载源代码,设置断点(至少是初始的断点),然后将调试器附加到应用程序(同时等待调试器)。从那时起,应用程序将从一个断点进入另一个断点。然而,遗憾的是,jswat没有在源代码本身上显示这一进展: - (

答案 2 :(得分:0)

当你启动dalvik时,还要在命令行上查找suspend = y JDWP选项...注意:我没有测试过这个,虽然dalvik能够使用正确的命令行选项暂停加载。

答案 3 :(得分:0)

我在非日食设置中注意到的一件事是,如果我仍然运行ADV,我可以调试会话(端口8700),但我不能让断点被击中...关闭ADV和有用。我不知道为什么但这对我有用。

Here是我的设置以防万一。我现在使用的是版本17,但除了相同的设置之外。