无法打开选定的虚拟机调试端口(8700)。

32

我正在尝试使用Eclipse调试android源代码,按照以下链接中的说明进行:

http://source.android.com/using-eclipse

我已经下载了源代码并成功编译。我按照上面的链接中的说明进行操作,一切正常,直到我运行ddms命令。此时,如果Eclipse正在运行,我会收到“无法打开选择的VM调试端口(8700)”的错误消息。如果我关闭Eclipse,则ddms可以正常运行,并且我可以在模拟器上看到进程。然而,如果我现在打开Eclipse,我会收到相同的错误消息。

无论我做什么,如果我尝试远程调试,它总是会失败,并显示“无法连接到远程VM”的错误消息。

有任何想法吗?

谢谢


请记住,您正在遵循的步骤允许您调试Android平台代码。有更简单的方法来调试应用程序代码。 - Tim Kryger
1
我最感兴趣的是更简单的方法。然而,我的目标是能够调试本地代码。我知道如何调试Java。 - John Gaby
1
这个过程无法帮助您调试本地代码。为此,您需要使用GDB并按照这些步骤进行操作。 - Tim Kryger
1
如果您正在使用Android Studio,您可以使用Android设备监视器,而DDMS是其中的一部分。 - Sam003
12个回答

19

看起来你有两个问题:

  1. 你试图同时运行两个DDMS。 你不需要运行独立的DDMS版本,因为它的一个版本已经作为Android插件的一部分集成在Eclipse中。如果你在Eclipse中切换到DDMS视图,我相信你会发现所有相同的功能都可用。

  2. 你没有告诉DDMS你要在localhost:8700上调试哪个虚拟机。 在尝试建立远程调试连接之前,你必须进入DDMS视图并点击系统进程(或者你想要调试的任何进程)。


谢谢您的回复。我本以为不需要DDMS,所以尝试了没有它进行调试,但仍然无法使其工作。这是我正在做的事情。1)Android模拟器正在运行,并且我要调试的进程正在运行。2)启动Eclipse3)从菜单中选择“Run / Debug Configurations”4)在“Remote Java Application”下选择“android-debug”选项。4)将主机设置为'localhost',端口设置为8700。5)点击调试6)我收到“无法连接到远程VM”的消息有什么想法吗?谢谢(为什么我的回复受到字符限制?) - John Gaby
我不确定你所说的“Remote Java Application”下的“android debug”选项是什么,但我仍然认为你的问题在于你没有在DDMS中选择要调试的进程,而且你真的应该使用Eclipse集成的DDMS。 - Tim Kryger
假设您已经安装了Android插件,打开Eclipse并选择Window->Open Perspective->Other...,然后选择DDMS。 - Tim Kryger
那似乎可以工作。我现在有一些新问题,但至少我已经解决了那个问题。非常感谢您的帮助! - John Gaby
如果您正在尝试运行DDMS两次,并且希望使用Eclipse实例,请通过以下方式终止另一个:adb kill-server - Maroloccio
显示剩余2条评论

18

出问题的Windows Host文件位于C:\WINDOWS\system32\drivers\etc,应该包含这行内容:

127.0.0.1 localhost

如果这不起作用,请尝试在Eclipse中进行以下更改。

在"窗口"->"首选项"->"Android"->"DDMS"下:

  • 将“基本本地调试器端口”设置为“8601”
  • 选中复选框“使用ADBHOST”,其值应为127.0.0.1

2
这似乎是在Android Studio和Eclipse中运行应用程序的解决方案,但实际上两者都无法运行。 - Sterling Diaz
因此,现在我能够同时使用AS和Eclipse,因为我的AS为每个项目导入打开新窗口(不知道原因),而我的系统(即使有8GB的RAM)无法同时运行两个AS。 - Shirish Herwade

7

我通过在任务管理器中结束"adb.exe"进程,然后通过Windows->Preference重新加载SDK解决了这个问题。我在Win 7 64位上运行Eclipse Indigo。


我不在Windows上,但也许只需要执行adb kill-server命令? - Maroloccio

5

我通过打开Windows任务管理器并关闭进程“adb.exe”来解决了这个问题。然后关闭Eclipse并重新打开它。它将正确启动,没有任何错误。


你的解决方案与Pallav发布的有何不同? - stuXnet
我同意它们非常相似...事实上,我只是按照他的指示进行了更正...因此我也点了赞他的回答...但是当我尝试重新加载SDK时,它显示了一些错误(我不记得确切的错误内容了)...因此我只是重启了Eclipse。我将这个答案作为Pallav解决方案的一个变体发表了出来。很抱歉我忘记在其中提到他的名字。 - sid_09

5

我也遇到了这个问题(Windows 7),即使我的/Windows/system32/drivers/etc/hosts文件中已经有127.0.0.1 localhost。我尝试在eclipse首选项中更改ADBHOST信息和端口,但没有任何作用。netstat -b显示adb和模拟器的源地址为127.0.0.1,但总是将我的机器主机名列为“外部地址”。凭直觉,我尝试在我的机器未连接到任何网络(没有WiFi,没有插入任何东西)的情况下进行调试...它起作用了!(DDMS能够连接到模拟设备上的VM,我可以很好地进行调试。)我认为DDMS和/或adb发送的消息没有留在我的本地机器上(它们被发送到我的本地路由器)。换句话说,环回没有按照应有的方式工作。由于我已经在我的本地主机中有了127.0.0.1,我将我的机器的本地子网地址添加到了我的hosts文件中,猜测DDMS / adb可能会使用该地址(而不是127.0.0.1)。对我来说,这似乎解决了问题。因此,我的hosts文件具有以下行:127.0.0.1 localhost ::1 localhost 192.168.1.102 localhost(我的机器的本地IPv4地址为192.168.1.102。您可以使用ipconfig命令检查您的地址。)(我找到了一些网页,介绍如何为Windows设置虚拟网络适配器来处理环回,例如Setting up a Microsoft Loopback Adapater (from Oracle Distilled),但我还没有时间去尝试看看这是否也是一个可行的解决方案。)

2

以下供参考,但我猜这可能符合您的情况。

端口8700是ddms非常特殊的端口;没有办法更改该端口。端口8700用于聚合来自每个Dalvik VM的数据包。

将有两种情况:

情况1)如果您在Eclipse ddms首选项对话框中设置“基本本地调试器端口”为8700,则每次ddms启动时都会看到错误消息:“无法绑定到本地8700进行调试”。但没关系,因为如果ddms无法将8700绑定到第一个VM,则将连接到8701,然后是8702等等。

情况2)即使您将“基本本地调试器端口”(在Eclipse ddms首选项对话框中)设置为8600,某些情况下仍可能看到错误消息:“无法绑定到本地8700进行调试”。因为如果您的设备具有100个或更多个Dalvik VM,则分配给每个VM的端口从端口8600开始,可能达到8700端口。但是,与情况1相同,不会出现任何问题。

因此,如果您真的不想看到错误消息,则必须将Eclipse ddms首选项对话框中的“基本本地调试器端口”设置为8701或更高。

独立的ddms或android monitor使用与Eclipse不同的设置文件,因此可能不会出现此类问题。


1

我通过重新启动计算机完成了它。


1
这种问题通常发生在使用另一个具有相同端口号的虚拟机时。例如,您正在使用从Android开发者网站下载的Android SDk完整包。现在,您想要使用Eclipse并插入ADT、SDK。很可能会出现这种类型的错误。我也遇到过这种问题。为了解决这个问题,您可以执行以下操作:
Window-Preferences-Android-选择DDMS-更改基本本地调试器端口(使用8601而不是8600)。
它可以起作用。谢谢

1

遇到了同样的问题,在控制台输出中(启动ddms时)发现了不同的端口号,这引起了我的注意

然后从文档中了解到,8600是默认的基本端口号。每个新进程使用下一个可用端口(8601、8602、...)。此外,8700是默认的活动端口号(表示dbms中当前选择的进程)

以下是调试Android源码+应用程序的步骤

  1. 运行模拟器
  2. 运行ddms
  3. 打开Eclipse(可能会提示无法连接到8600端口。这是因为,当Eclipse启动并且您安装了Android插件时,它会启动ddms。由于我们已经有一个连接到设备的ddms,尝试第二次连接将不起作用)
  4. 在ddms中,选择要调试的线程(当您将其突出显示时,它将向您显示它正在使用的端口以及8700(例如“8649 / 8700”)。这意味着您可以使用两个端口连接到此进程)
  5. 从Eclipse中,使用远程调试配置,连接到任何您想要的进程(最简单的方法是从ddms中突出显示进程,然后连接到8700)

0

仅为完整起见:(在win 7 / Vista上)不仅您必须确保行

127.0.0.1 localhost

存在于

C:\WINDOWS\system32\drivers\etc

你还需要注释掉所有从127.0.0.1解析的其他本地虚拟主机。如果你在同一台机器上开发Web应用程序并为不同的主机名设置了回环到本地的配置,则很可能是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接