Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android与jdb混淆使用waitForDebugger_Android_Debugging_Jdb - Fatal编程技术网

Android与jdb混淆使用waitForDebugger

Android与jdb混淆使用waitForDebugger,android,debugging,jdb,Android,Debugging,Jdb,我想使用命令行在我的设备上调试我的Android应用程序(NexusOne,而不是模拟器) 我对如何使用jdb结合android.os.Debug.waitForDebugger设置断点感到困惑 假设我将以下代码放入我的主要活动onCreate: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

我想使用命令行在我的设备上调试我的Android应用程序(NexusOne,而不是模拟器)

我对如何使用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
就可以立即继续运行应用程序,而不会停止

e、 g


在运行
jdb
之前有没有预设断点的方法,或者有没有启动
jdb
设置断点然后附加的方法

不幸的是,VM无法告诉调试器它已经挂起。如果初始状态不是“正在运行”,我尝试过的各种调试器都会感到困惑。因此,在调试器连接之后,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)给自己一点额外的时间来关闭断点。

jdb有一个配置文件:~/.jdrbc在Linux中。e、 g在我的报告中,我有:

stop in net.richardriley.myproj.myact.onCreate

在设备仿真器开发设置中,可以为相关应用程序类设置“等待调试器”。运行应用程序,启动调试器,调试器将崩溃。

我尝试了两种解决方案(fadden的和Richard Riley的),但都不起作用。一旦jdb连接到调试端口(通过Dalvik连接8700),emulator中启动的应用程序就会被解锁,但随后它会自行运行,根本不会与jdb同步。引入等待循环不会改变任何事情,而.jdbrc中的断点命令也没有效果。jdb的回答总是“延迟断点等。它将在类加载后设置”,因为应用程序没有运行;但是,如果您键入“run”,答案是“Nothing suspended.”,因为应用程序已经在运行了…

谢谢您提供的信息。这也很有趣。。。我可以在不添加任何睡眠代码的情况下使用JSwat,它还可以在waitForDebugger调用后设置断点。底线是我正在寻找一个Android调试解决方案,与Mac上的TextMate或Emacs一起使用。我不是Eclipse的粉丝,我正在寻找更“浓缩”的东西,因为我几乎只在MacBookPro 13上工作“。我希望将一些简单的jdb功能连接到TextMate捆绑包或Emacs helpers中。这实际上只是一个时间问题。如果您可以使用一个脚本驱动jdb,并且足够快地完成断点命令,那么它就可以工作了。我向Eclipse人员提交了一个特性请求,以使调试器更好地处理连接到挂起的VM的问题,但我不希望这种情况很快发生(如果有的话)。因为它不会修复其他具有类似行为的调试器,所以我无论如何也不能在VM中使用它。。。法登,谢谢你的帮助!我想我将在Eclipse中创建、管理和调试Android项目,并使用外部编辑器编写代码。经典故事。。。遵从或感受到头撞在墙上的疼痛,而每个人都声称这是不存在的。继续。。。这似乎根本不起作用。但是,stop at:doeswork我也无法停止工作,但是stop at:works在.jdbrc文件中。我已经核实过了。查看链接问题的答案。
stop in net.richardriley.myproj.myact.onCreate