什么导致了IOException和Broken pipe?

47

我的AVD是API 15版本的,不知道为什么,每次在模拟器上运行应用程序时都会出现以下消息。除了控制台中的错误消息外,似乎没有引起任何麻烦。

[2012-06-17 00:03:26 - ddmlib] Broken pipe
java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:122)
    at sun.nio.ch.IOUtil.write(IOUtil.java:93)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:352)
    at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)
    at com.android.ddmlib.Client.sendAndConsume(Client.java:575)
    at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:348)
    at com.android.ddmlib.Client.requestAllocationStatus(Client.java:421)
    at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:837)
    at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:805)
    at com.android.ddmlib.DeviceMonitor.processIncomingJdwpData(DeviceMonitor.java:765)
    at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:652)
    at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:44)
    at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:580)

可能的原因是什么?

13个回答

32
如果有人同时使用eclipse和android studio,那么eclipse将会抛出这个错误。因此,即使您通过DDMS选择设备,也会抛出此错误。

13

虽然这是一个老问题,但仍然与时俱进,我没有看到其他回答提供这些信息:

对于我来说,当另一个Eclipse同时运行,并且DDMS与试图连接到Android设备的Eclipse竞争同一个套接字时,就会出现这个问题。

解决方案是关闭另一个Eclipse。希望能对某些人有所帮助。

更新:可能更好的解决方案是将其他Eclipse的DDMS端口编辑为您不使用的端口,这样就可以避免竞争了。


1
这是唯一对我起作用的解决方案。我在访客帐户和我的用户帐户上运行Eclipse时遇到了这个问题。一旦我关闭了访客帐户上的Eclipse,问题就被解决了。 - W.K.S
在我的情况下,与Eclipse并行运行的是Android Studio。 - tmanthey

6

当我同时打开monitor和Eclipse ADT时,这种情况也发生在我身上。尝试关闭所有与Android相关的内容,然后执行adb kill-server && sleep 5 && adb devices,然后再次启动你的工具(Eclipse/Ant/AS)。


此外,请关闭任何其他已打开的 Android Studio 实例,这些实例中您可能已经启动了应用程序。 - Mafro34
我发现只需使用 adb kill-server 命令就可以解决我的问题。 - ThomasW

5
“Broken pipe”意味着您向已被对等方关闭的连接写入了数据。解决方法:不要这样做。这实际上是一个应用程序协议错误。

4
我猜测客户端(Eclipse)通过管道协议与服务器(您的模拟器)进行通信(这种协议被广泛用于在同一台机器上通信的两个进程之间)。
通信渠道有时可能会中断。(有可能有100多个原因)
解决此问题的方法是:重新启动模拟器(AVD)。也许您需要等待一会儿(约1分钟?),以便Eclipse可以恢复管道通道并返回您的Log Cat。否则,重新启动Eclipse和模拟器以摆脱此错误。

我重新启动了模拟器,但仍然遇到了这个问题。通过进入AVD管理器,删除AVD并创建一个新的AVD,我成功地解决了这个问题。不知道为什么,但它修复了这个问题。 - Josh Petitt
2
如果 AVD 出现故障,您可以尝试打开 AVD 管理器 > 启动.. > 勾选“擦除用户数据”以重置您的 AVD。 - Hiep
猜错了。异常非常清楚地表明他正在使用套接字,而不是管道。 - user207421

2

最近我发现这种情况经常发生(大约每5分钟一次)。

如果我同时运行物理设备和模拟器,频率似乎会增加。

停止模拟器并仅使用物理设备进行调试可以减少其发生频率 - 现在我一天只看到它一两次。

当出现此问题时,您无需关闭模拟器或重新启动设备 - 关闭并重新打开USB调试模式应该会使其再次显示在adb下。


2
我经常遇到"管道中断"的最常见原因是一台机器(通过套接字进行通信的一对机器之一)在通信完成之前关闭了套接字的一端。其中有一半是因为在该套接字上通信的程序已终止。
如果发送字节的程序将它们发送出去并立即关闭套接字或终止自身,则可能在字节被传输和读取之前套接字停止工作。
尝试在关闭套接字之前和允许程序终止之前放置暂停,看看是否有所帮助。
FYI:"pipe"和"socket"有时可以互换使用。

如果一个程序发送数据然后关闭套接字,那么套接字会一直发送数据直到所有数据被确认或发生故障。在网络程序中添加暂停只会表现出对底层问题的误解,它并不能解决任何问题。 - user207421

1
我已经苦苦挣扎这个问题很久了。每当我想使用Chrome的调试工具来调试Android移动应用程序时,我都会在5分钟内断开连接。
我发现这的确是其他正在运行的进程使用了连接到手机的OS后台,从而破坏了手机和操作系统之间的通信。
我使用Macbook Pro,并运行IntelliJ IDEA调试器+ Android文件传输(不知道这是在后台运行),以及Chrome的调试工具。当我使用“Activity Monitor”工具关闭Android文件传输进程时,一切都正常工作,手机和操作系统之间没有更多的断开连接。我的建议是始终检查是否正在运行其他Android进程。

0

“Broken pipe” 异常是指在客户端关闭套接字连接时发生的异常。大多数情况下,这不是什么值得担心的事情。


那么为什么客户端会在另一端关闭呢? - manuzhang
另一端的程序关闭或用户停止了请求。例如,在HTML页面中单击链接,浏览器将关闭所有其他挂起的请求,然后服务器将遇到这些“Broken pipe”异常。 - user789805
所以我的疑问是,为什么当我仅在模拟器上运行应用程序时会发生这种情况? - manuzhang
从堆栈跟踪来看,我猜测模拟器与IDE的连接断开了(?)。也许是因为它没有准备好或者上传了新版本? - user789805
1
当你尝试向已经关闭的套接字写入数据时,为什么不需要担心?难道应用程序协议错误无关紧要吗? - user207421

0
如果有人还没有找到解决方案,我来分享一下。在Eclipse的Neon版本中,当我在插件目录下放置了两个DDMS Jar包时,出现了这种情况。我放了andmore.ddms.jar 和 com.android_ddms.jar两个Jar包。只需要删除其中一个就可以解决这个错误,我猜测他们都会竞争连接相同的端口。

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