我想使用命令行在我的设备(Nexus One --不是模拟器)上调试我的Android应用程序。
我对如何结合使用jdb和android.os.Debug.waitForDebugger来设置断点感到困惑。
假设我将以下代码放入我的主活动onCreate中
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
android.os.Debug.waitForDebugger();
int j = 10;
int r = j;
}使用ddms,我可以看到当我启动应用程序时,它正在等待调试器(红色的bug图标)。
但是,我不知道如何在waitForDebugger()调用后设置断点,以便开始单步执行。
显然,只需附加jdb就会立即继续运行应用程序,而不会停止。
例如:
jdb -attach localhost:8700有没有办法在运行jdb之前预置断点,或者启动jdb时先设置断点,然后再附加?
发布于 2010-06-25 03:43:38
不幸的是,VM无法告诉调试器它已经挂起了。如果初始状态不是"running“,我尝试过的各种调试器都会感到困惑。因此,在调试器连接之后,VM必须恢复所有线程。(上面的唯一例外是如果虚拟机刚刚启动,在这种情况下,它可以发送一个特殊的“我刚刚启动”消息,指示它是要启动、运行还是保持挂起。这在这里没有帮助。)
waitForDebugger()所做的就是等待调试器发出的初始突发活动平息下来。调试器连接后,该方法将处于休眠状态,直到调试器在1.5秒内没有任何活动。这使调试器有机会在VM恢复之前设置任何断点。
对于Eclipse,这个技巧效果很好,因为您可以在附加之前配置断点。对于jdb,我没有办法在它启动后告诉它附加,所以你必须在键盘上快速操作,或者使用某种配置文件(我也看不到)。
您可以用不同的方法来解决这个问题:在waitForDebugger调用下面,添加一个循环,如下所示:
static volatile boolean staticField = false;
...
while (!MyClass.staticField) {
Log.d(tag, "waiting for go");
Thread.sleep(2000);
}然后,在按照您想要的方式配置jdb之后,使用如下内容:
> set MyClass.staticField = true如果你速度快,你可以跳过循环,只使用Thread.sleep(5000),给自己一点额外的时间来处理断点。
发布于 2010-08-13 03:42:35
在Linux中,jdb有一个配置文件:~/.jdrbc。例如,在我的文章中,我有:
stop in net.richardriley.myproj.myact.onCreate在您的设备仿真器开发设置中,您可以为有问题的应用程序类设置“等待调试器”。运行应用程序,启动调试器,调试器就会中断。
发布于 2010-10-12 01:28:26
我尝试了两种解决方案( fadden和Richard Riley的解决方案),但都不起作用。一旦jdb连接到调试端口(通过Dalvik连接到8700),在仿真器中启动的应用程序就会被解锁,但随后它会独立运行,根本不与jdb同步。引入等待循环不会改变事情,.jdbrc中的断点命令也不起作用。jdb的回答总是“推迟断点等。它将在类加载后设置。”,因为应用程序没有运行;但是,如果你输入"run“,答案是"Nothing Suspend.”,因为应用程序已经在运行了……
https://stackoverflow.com/questions/3107587
复制相似问题