2012-06-16 22 views
42

Mój AVD ma API 15, nie wiem dlaczego, ale poniższy komunikat pojawia się zawsze, gdy uruchamiam aplikację na emulatorze. Wygląda na to, że nie spowodowało żadnych problemów, z wyjątkiem komunikatu o błędzie w konsoli.co spowodowało IOException i Broken pipe

[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) 

Co może być przyczyną?

Odpowiedz

-1

Wyjątek "Przerwana rura" występuje, gdy połączenie z gniazdem jest zamykane przez klienta po drugiej stronie. Zazwyczaj nie ma się o co martwić.

+0

Dlaczego więc klient mógł zostać zamknięty w innym rozmiarze? – manuzhang

+0

Program na drugim końcu zamknięty lub użytkownik zatrzymał żądanie. Na przykład, kliknij łącze na stronie HTML, a przeglądarka zamknie wszystkie inne oczekujące żądania, a następnie serwer napotka wyjątki "Przerwane potoki". – user789805

+0

Tak więc mam wątpliwości, dlaczego tak się stało, gdy po prostu uruchomiłem aplikację na emulatorze? – manuzhang

4

Domyślam się, że klient (Eclipse) komunikuje się z serwerem (emulatorem) przez protokół Pipe (ten protokół jest dobrze znany, aby komunikować 2 procesy na tym samym komputerze).

Kanał komunikacji może być czasem przerwany. (Jest to możliwe z ponad 100 powodów)

Aby rozwiązać ten problem: zrestartuj emulator (AVD). Może będziesz musiał poczekać chwilę (~ 1min ??), aby Eclipse mógł przywrócić kanał Pipe, a twój Log Cat powróci. W przeciwnym razie zrestartuj emulator Eclipse &, aby pozbyć się tego błędu.

+0

Uruchomiłem ponownie emulator, ale wciąż miałem ten problem. Udało mi się zdobyć fajkę, przechodząc do menedżera AVD, usuwając AVD i tworząc nowy. Nie wiem dlaczego, ale naprawił problem. –

+2

jeśli AVD jest zepsuty, możesz spróbować otworzyć AVD Manager> Start ..> zaznacz "Wipe user data", aby zresetować AVD – Hiep

+0

Złe domysły. Wyjątek wyraźnie pokazuje, że używa on gniazda, a nie rury. – EJP

2

Najczęstszą przyczyną "zerwanej rury" jest to, że jedna maszyna (pary komunikującej się za pośrednictwem gniazda) wyłączyła koniec gniazda przed zakończeniem komunikacji. Mniej więcej połowa z nich wynikała z zakończenia programu komunikacyjnego na tym gnieździe.

Jeśli program wysyłający bajty wysyła je i natychmiast zamyka gniazdo lub sam się kończy, możliwe jest, że gniazdo przestaje działać przed przesłaniem i odczytaniem bajtów.

Spróbuj wstawiać pauzę w dowolnym miejscu, gdzie zamykasz gniazdo i zanim zezwolisz programowi zakończyć działanie, aby sprawdzić, czy to pomaga.

FYI: "pipe" i "socket" to terminy używane czasem zamiennie.

+0

Jeśli program wysyła dane, a następnie zamyka gniazdo, gniazdo wysyła dane, dopóki nie zostaną potwierdzone lub wystąpi błąd. Dodanie pauz do programów sieciowych wykazuje tylko niezrozumienie podstawowego problemu. Nic nie rozwiązuje. – EJP

2

Zauważyłem, że zdarza się to często (co 5 minut). Częstotliwość wydawała się wzrastać, gdy miałem uruchomione zarówno urządzenie fizyczne, jak i emulator.

Zatrzymanie emulatora i tylko używanie urządzenia fizycznego do debugowania zatrzymało to tak często - teraz widzę je tylko raz lub dwa razy dziennie.

Aby rozwiązać problem, gdy się to zdarza, nie trzeba zamykać emulatora ani restartować urządzenia - wyłączenie trybu debugowania USB i ponowne włączenie powinno spowodować, że będzie on ponownie wyświetlany pod adb.

12

Stare pytanie, ale nadal istotne i nie widzę żadnej innej odpowiedzi z tych informacji:

Dla mnie stało się to, gdy inny Eclipse został uruchomiony w tym samym czasie, z DDMS konkurować w tym samym gnieździe jako Eclipse próbuje połączyć się z urządzeniem z systemem Android.

Rozwiązaniem było zamknięcie drugiego Eclipse. Mam nadzieję, że to komuś pomaga.

Aktualizacja: Prawdopodobnie lepszym rozwiązaniem jest edycja portu DDMS drugiego zaćmienia na coś, czego nie używasz. Więc nie ma wyścigu.

+1

To jedyne rozwiązanie, które sprawdziło się u mnie. Miałem ten problem podczas uruchamiania Eclipse na koncie gościa i na moim koncie użytkownika. Po wyłączeniu Eclipse na koncie gościa problem został rozwiązany. –

+0

W moim przypadku to Android Studio działało równolegle do Eclipse. – tmanthey

-3

W moim przypadku usunę plik .android w moim katalogu domowym. To jest w porządku.

31

Jeśli ktoś używa jednocześnie zarówno środowiska zaćmieniowego, jak i androida, błąd zostanie rzucony przez środowisko. Nawet jeśli wybierzesz urządzenie za pomocą DDMS, spowoduje to błąd.

6

Stało się tak, gdy miałem otwarte zarówno monitor, jak i Eclipse ADT. Spróbuj zamknąć wszystkie rzeczy związane z systemem Android, a następnie wykonaj adb kill-server && sleep 5 && adb devices, a następnie ponownie uruchom narzędzie (Eclipse/Ant/AS).

+0

Zamknij również wszystkie inne otwarte instancje Androida Studio, z których uruchomiono aplikację. – Mafro34

+0

Znalazłem, że samo użycie 'adb kill-server' rozwiązało problem dla mnie. – ThomasW

5

"Zerwana rura" oznacza zapisanie danych do połączenia, które zostało już zamknięte przez partnera. Rozwiązanie: nie rób tego. Jest to w zasadzie błąd protokołu aplikacji.

0

Używałem zarówno Androida Studio, jak i DDMS. Zamknięcie DDMS naprawiło problem dla mnie.

Ponowne uruchomienie Androida Studio nie miało żadnego wpływu.

1

Od dawna zmagam się z tym problemem. Ilekroć chciałem debugować aplikację mobilną na Androida za pomocą narzędzia do debugowania Chrome, rozłączałem się co 5 minut.

Dowiedziałem się, że przyczyną tego jest rzeczywiście inny proces, który wykorzystuje połączenie z telefonem komórkowym, który działa w systemie operacyjnym, który przerywa komunikację między telefonem komórkowym a systemem operacyjnym.

Używam Macbook Pro i miałem uruchomiony debugger IntelliJ IDEA + Android File Transfer (nie wiedziałem, że to działa) i narzędzie do debugowania Chrome. Po zamknięciu procesu przesyłania plików w Androidzie za pomocą narzędzia "Monitor aktywności" wszystko działało dobrze, nie było już żadnego rozłączenia między telefonem komórkowym a systemem operacyjnym. Moja sugestia to sprawdzanie zawsze, jeśli używasz innego procesu Android.

0

Jeśli ktoś jeszcze nie znalazł rozwiązania tego problemu. W Eclipses Neon zdarzyło się to, gdy miałem dwa słoiki DDMS w katalogu wtyczek. Miałem plik andmore.ddms.jar i com.android_ddms.jar. Usunięcie jednego rozwiązuje błąd, myślę, że obaj konkurują o połączenie z tym samym portem.

Powiązane problemy