2015-03-26 32 views
5

Mój zbiór danych jest nieco większy niżi może istnieć inna egzotyczna różnica.Jakikolwiek sposób debugowania aplikacji z zestawem danych w środowisku produkcyjnym?

Jest nieprzyjemna deadlock przy użyciu mojej aplikacji w trybie produkcji. Czy jest możliwe debugowanie klienta w jakikolwiek sposób? A może powinienem zarejestrować jak najwięcej rzeczy i jakoś wysłać?

Jest to problem z gwintowaniem, więc bez sprawdzania wątków w Xcode, naprawdę robi się wszystko. Dowolny pomysł? Używam danych podstawowych do lokalnego magazynu.

+0

Próbowałem zwinąć adres URL, ale otrzymałem 403 zabronione. –

+0

Czy wypróbowałeś go na urządzeniu z jailbreakiem i użyłeś cycript? –

Odpowiedz

5
  1. Cofnij zmiany w kodzie źródłowym, aby móc uruchomić aplikację.
  2. Zsynchronizuj rekordy ze środowiska produkcyjnego z lokalnym przechowywaniem danych podstawowych.
  3. Skopiuj w Xcode Menu urządzenia bazy danych sqlite z kontenera.
  4. Utwórz tymczasowy projekt z tym samym modelem i zapełnij go bazą danych.
  5. Skonfiguruj projekt tymczasowy tak, aby był w stanie używać poprzedniego kontenera CloudKit.
  6. Resetuj środowisko programistyczne na pulpicie nawigacyjnym.
  7. Prześlij cały rekord z projektu tymczasowego.
  8. Uruchom oryginalny projekt z oryginalnym kodem źródłowym.
0

Polecam korzystanie z usługi zgłaszania awarii. Chociaż istnieje kilka opcji tam, pracowałem z Crashlytics i byłem bardzo szczęśliwy z raportów, które dostarczyli, zawsze pomagając mi naprawić błędy w produkcji.

+0

hmm, to nie jest awaria, a konfiguracja może trochę potrwać, czy jest w stanie pokazać coś na temat wątków? –

+0

Tak, może nie być najlepszym pomysłem, jeśli nie masz awarii. Ale jeśli masz awarię, pokaże ci stan wszystkich wskazanych wątków, bardzo łatwo zauważyć, co każdy z nich robił w tej chwili. – pteofil

0

Gdy aplikacja pójdzie w tle, w pewnym momencie zostanie zabity przez iOS, ponieważ twój wątek nie odpowiedział na -applicationDidEnterBackground, a otrzymasz ślad wszystkich wątków.

Jeśli chcesz mieć większą szansę na wywołanie zabójstwa (jeśli zablokowany wątek nie jest głównym wątkiem), możesz pobrać zadanie w tle (- beginBackgroundTaskWithExpirationHandler:) w wątkach roboczych: jeśli zostaną zablokowane w pewnym momencie, nigdy nie będą zwolnij zadanie w tle, a one spowodują zabicie.

Teraz wystarczy poczekać, aż program ładujący iOS zabije twoją aplikację i pobierze ślad stosu. W tym miejscu powinieneś być w stanie znaleźć winowajcę, patrząc na ślady wszystkich wątków i określić, które z nich są zablokowane w funkcji mutex lock().

Założę się, że nie potrzebujesz do tego symboliki.