2015-05-06 12 views
12

Od czasu przejścia na system iOS 8.3 napotykam ten błąd, gdy główny wątek utknie w tym wywołaniu. Kilka innych wątków również utknęło w tym wywołaniu. Nie ma żadnego kodu w żadnym wątku, który prowadzi do tego połączenia, więc jestem zaskoczony, dlaczego tak się dzieje. Zdarza się losowo, czasami, gdy dotykając element pasek przycisków, czasami podczas przerysowywania wykresów (używając ShinobiCharts) itdJak debugować syscall_thread_switch w iOS 8.3?

Oto ślad stosu z Xcode:

enter image description here

Ktoś ma żadnego pojęcia, dlaczego tak się dzieje i jak to naprawić? To bardzo denerwujące, ponieważ kiedy utknę tam, muszę ponownie uruchomić aplikację. Zauważ, że tak się dzieje w symulatorze. Jestem w początkowej fazie rozwoju tej aplikacji i spędzam większość czasu w symulatorze. Nie widziałem jeszcze błędu na prawdziwym urządzeniu, ale znowu nie uruchomiłem aplikacji często na urządzeniu.

+0

W lldb zatrzymaj się, gdy napotkasz tę blokadę wątku i wpisz 'bt all' w debugerze, aby wyświetlić pełny stos pamięci i umieść tutaj dziennik. – JAL

+0

Mam do czynienia z tym samym problemem .. @nemesys znalazłeś jakieś rozwiązanie –

+0

@JAL zrobi, gdy to się powtórzy. Tak jak powiedziałem wcześniej, nie byłem w stanie wiarygodnie go odtworzyć, więc może minąć trochę czasu, zanim będę miał ślady. – Shalmezad

Odpowiedz

5

Pukanie w drewno, ale myślę, że to wymyśliłem (przynajmniej w moim przypadku).

Co doprowadziło do rozwiązania było poszukiwanie syscall_thread_switch, co doprowadziło mnie do tego odpowiedź tutaj: https://stackoverflow.com/a/30333203/978509

Które, jeśli spojrzeć na backtrace I połączone (https://gist.github.com/Shalmezad/65ff89d20aa7e0a9d094), każdy syscall_thread_switch poprzedzony OSSpinLockLockSlow, na które odpowiedź wskazuje, że są one podobne do Livelock, ale ze względu na niskie użycie procesora, bardziej widoczne jest zakleszczenie.

Przechodząc przez mój kod, stwierdziłem, że dla każdego zadania w tle, stworzyłem za każdym razem nowy parametr dispatch_queue_t. Odkąd zmieniłem sposób działania tej samej kolejki, która prawdopodobnie rozwiązała problem.

Bez dodatkowych informacji z nemezis (głównie z fragmentów kodu pokazujących, jak konfiguruje zadania w tle), nie mogę odpowiedzieć na ich konkretne pytanie, jednak powinno to wskazywać ludziom właściwy kierunek rozwiązania problemu.

+0

Mam 2 kolejek w moim kodzie, jeden równoczesny i jeden szeregowy.Oba są zarządzane przez mojego delegata aplikacji i jestem przekonany, że nie tworzę żadnych innych. Jednak używam ShinobiCharts i robią pewne przetwarzanie w tle. To może być ich kod, ale nie mogę powiedzieć. Już je powiadomiłem, ale nie otrzymałem jeszcze żadnych wiadomości od nich. – nemesys

Powiązane problemy