我在模拟器上使用独立的 java 调试器和 Android 应用程序时遇到问题。显然,可以通过遵循以下步骤来利用任何具有远程功能的 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”对于在本地主机上运行的非 Android Java 应用程序来说效果很好。
有什么提示(除了“请使用 eclipse”)吗?
我是否遗漏了某个愚蠢的细节?
该应用程序是一个HelloWorld,构建命令是“ant debug”。
提前谢谢您。
最佳答案
最好的方法似乎是在 .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]
所以关键似乎是在断点中使用特定的行号。尝试一下。希望它对您有所帮助并且对您也有用。
关于使用 "jdb -attach"(或 jswat)调试 Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913335/