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

我在模拟器上将独立的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应用程序也能正常工作。

有什么提示(“请使用日食”除外)?

我只是在任何地方都缺少愚蠢的细节吗?

该应用程序是一个HelloWorld,构建命令是“ ant debug”。

先感谢您。

回答:

最好的方法似乎是在.jdbrc文件中设置断点,因为这些断点已加载并被延迟,并且您无需更改代码来设置任意延迟循环来尝试在调试器等待时捕获它。我和您一样,发现如果在类名上设置断点,则它不起作用。它说推迟到类加载之前,但是似乎在加载类时jdb永远不会得到通知。

但是,如果您在特定的类和行号上设置了断点,则它确实可以工作

在您的.jdbrc文件中:

stop com.android.helloandroid.HelloAndroid

stop 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]

因此,关键似乎在于在断点中使用特定的行号。试试看。希望它能对您有所帮助并为您工作。

以上是 使用“ jdb -attach”(或jswat)调试android应用 的全部内容, 来源链接: utcz.com/qa/414946.html

回到顶部