9

我在模拟器上使用带有 android 应用程序的独立 java 调试器时遇到了麻烦。显然,可以按照以下步骤使用任何具有远程功能的 Java 调试器,例如 jdb(或 jswat)(正如我在此处和那里阅读后所理解的那样):

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

2)打开dalvik服务器(ddms)

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

4)再次在模拟器中,运行您的应用程序;它将阻塞,等待调试器附加,dalvik 将显示一个被“红色错误”标记的新进程

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

4 回答 4

5

The best way seems to be to set the breakpoint in your .jdbrc file, since these are loaded and deferred and you don't have to change your code to set arbitrary delay loops trying to catch the debugger while it's waiting. I, like you, have found that it does not work if you set break points on a class name. It says deferring until the class is loaded, but then it seems the jdb never gets notified when the class is loaded.

However it does work if you set a breakpoint at a specific class and line number

in your .jdbrc file:

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

The first line does nothing, as you already know. The second line works for me here:

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] 

So the key seems to be to use specific line numbers in your breakpoints. Give that a try. Hope it helps you out and works for you too.

于 2010-10-16T11:44:22.257 回答
0

我在非 Eclipse 设置中注意到的一件事是,如果我的 ADV 仍在运行,我可以附加调试会话(端口 8700),但我无法命中断点......关闭 ADV 并且它可以工作。我不知道为什么,但这对我有用。

是我的设置,以防万一。我现在使用的是第 17 版,但除此之外,它的设置相同。

于 2013-05-09T18:39:16.657 回答
0

当你启动 dalvik 时,还要在命令行上寻找 suspend=y JDWP 选项... 注意:我没有对此进行测试,尽管 dalvik 有能力在加载时挂起正确的命令行选项。

于 2011-10-13T05:48:35.370 回答
0

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

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

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

于 2010-10-18T08:38:46.067 回答