Skip to main content
Ten proces pozwala rejestrować natywne awarie i zawieszenia głównego wątku w aplikacji iOS. Rejestrowanie zawieszeń wymaga UIKit. Prześlij pasujący dSYM, aby zobaczyć miejsca w kodzie źródłowym w ramkach stosu. Gdy aplikacja ulega awarii, zapisuje lokalny raport. Przy kolejnym uruchomieniu aplikacja wywołuje ponowne wysyłanie (replay), aby przekazać dowody awarii do LogBrew. LogBrew nie wysyła surowego raportu Apple.
Używaj LogBrew Swift 0.1.6 lub nowszego. Do przesyłania artefaktów debugowania używaj natywnego CLI LogBrew 0.1.24 lub nowszego.
W aplikacji używaj konfiguracji wysyłania przypisanej do projektu. Do przesyłania artefaktów i odczytu problemów zaloguj się na konto. Z maszyny do buildów artefakty może przesyłać również klucz artefaktów projektu. Nigdy nie umieszczaj w aplikacji tokena dostępu do konta ani klucza artefaktów.

Zaplanuj zakres rejestrowania

Sprawdź, kiedy aplikacja może ponownie wysłać każdy rodzaj niepowodzenia. Ustaw wartość wydania przed buildem. Musi ona identyfikować wersję aplikacji i build. Użyj tej samej wartości w SDK, przy przesyłaniu dSYM i w filtrze problemów. Nie dołączaj do metadanych awarii danych użytkownika, treści żądań ani nagłówków.

Dodaj produkt obsługi awarii

Najpierw skonfiguruj telemetrię SDK w aplikacji. Ponowne wysyłanie używa tych obiektów client i transport. Dodaj publiczny zestaw SDK przez Swift Package Manager.
Dodaj produkt LogBrew, aby wysyłać telemetrię. Dodaj LogBrewCrash tylko wtedy, gdy aplikacja jawnie włącza rejestrowanie natywnych awarii lub zawieszeń. Integracja rejestrowania obsługuje iOS 15 lub nowszy. Utrzymuj jeden obiekt rejestrowania należący do aplikacji, bo natywne procedury obsługi błędów krytycznych działają w całym procesie.

Skonfiguruj jedną dokładną tożsamość

Użyj tego samego projektu, wydania, środowiska i usługi w konfiguracji aplikacji i przy przesyłaniu artefaktów. LogBrew nie wylicza ani nie zastępuje tych wartości.
Zainstaluj obiekt rejestrowania w głównym wątku, zanim utworzysz główny interfejs. Najpierw utwórz jego katalog nadrzędny. Katalog na raporty musi należeć do aplikacji i być prywatny. Obiekt rejestrowania zapisuje wyjątki Mach, sygnały, wyjątki C++ i wyjątki Objective-C. Lokalny raport nie zawiera zawartości pamięci, nazw kolejek ani logów konsoli. Lokalny raport awarii może zawierać poufne dane aplikacji i urządzenia. Nie umieszczaj go w kopiach zapasowych w chmurze ani w katalogach współdzielonych. Zamiast surowego raportu LogBrew wysyła UUID ramek, architektury i przesunięcia (offsety). NativeCrashConfiguration ma dwa opcjonalne limity: Wartość spoza zakresu sprawia, że konfiguracja zgłasza crash_invalid_configuration.

Włącz rejestrowanie zawieszeń

Rejestrowanie zawieszeń jest wyłączone, gdy watchdog ma wartość nil. Aby je włączyć, zastąp powyższą deklarację watchdog, zanim wywołasz install():
Próg podajesz w sekundach, od 1 do 30. Rejestrowanie zawieszeń wymaga też artifactIdentity. Bez niej konfiguracja zgłasza crash_invalid_configuration. Utrzymuj jeden obiekt crashCapture przez cały czas życia procesu. Drugiego obiektu rejestrowania nie da się zainstalować. Jego wywołanie install() zgłasza crash_capture_owned. Aby zmienić próg, użyj nowej wartości przy kolejnym uruchomieniu aplikacji. Zawieszenie, po którym aplikacja wróciła do działania, jest wysyłane ponownie z crash.handled ustawionym na true. Trwające zawieszenie przerwane zamknięciem procesu jest wysyłane ponownie z crash.handled ustawionym na false. Oba warianty zawierają liczbowe metadane durationMs. Zachowują tę samą tożsamość artefaktu, której używają ramki krytycznej awarii. Watchdog wstrzymuje działanie, gdy aplikacja jest nieaktywna lub działa pod debuggerem. Wyłącza też rejestrowanie przy poważnym obciążeniu termicznym. Krótki próg może zgłaszać zwykłą pracę głównego wątku jako zawieszenia. Przetestuj próg w konfiguracji builda, którą wydajesz. Stan obsłużenia opisuje powrót do działania. Nie oznacza problemu jako rozwiązanego. Obsłużone zawieszenie i tak zablokowało interfejs, więc też je przejrzyj.

Wyślij raporty ponownie po uruchomieniu

Po zainstalowaniu rejestrowania wyślij ponownie oczekujące raporty przez klienta SDK.
Aplikacja musi wywołać ponowne wysyłanie. Sam powrót do działania po zawieszeniu nie wysyła zdarzenia. Wywołaj tę samą metodę po powrocie do działania albo przy kolejnym uruchomieniu. Ponowne wysyłanie przetwarza poprawne raporty od najstarszego i zachowuje ich stałe ID zdarzeń. Po nieudanym dostarczeniu raport nadal oczekuje. Gdy LogBrew przyjmie raport, aplikacja go usuwa. Ponowne wysyłanie odrzuca raporty, których nie może odczytać, i raporty większe niż maxReplayBytes. Sprawdź wszystkie trzy liczniki. Sam zerowy licznik oczekujących raportów nie dowodzi dostarczenia. Włącz trwałe dostarczanie przed ponownym wysyłaniem, gdy nieudane żądanie musi przetrwać kolejny restart. Nie wywołuj purge(), gdy naprawiasz zwykłe problemy z siecią lub uwierzytelnianiem.

Prześlij pasujący dSYM

Zarchiwizuj aplikację z włączonymi informacjami debugowania. Zachowaj dSYM z dokładnie tego builda, którego używają użytkownicy. Sprawdź UUID jego obrazów.
Przed przesłaniem zweryfikuj artefakt lokalnie.
Powtórz --expect-image-uuid dla każdej wymaganej architektury. Polecenie kończy się błędem, gdy znaleziony zbiór UUID różni się od oczekiwanego. Sprawdź dostęp do konta. Potem uruchom to samo polecenie bez --dry-run.
Polecenie przesyłania weryfikuje obsługiwane obiekty Apple i sprawdza każdą przesłaną tożsamość. Nie umieszcza lokalnych ścieżek ani nazw plików w metadanych API. Wynik pokazuje pole JSON status: Maszyna do buildów może przesyłać pliki z kluczem artefaktów projektu w LOGBREW_TOKEN zamiast dostępu do konta. Utwórz klucz tak, jak opisuje sekcja Utwórz klucz artefaktów. Takie przesłanie zgłasza uploaded. Później zweryfikuj każdą tożsamość z dostępem do konta:
status: "found" potwierdza artefakt. status: "missing" oznacza, że LogBrew nie ma artefaktu dla tej tożsamości. Rozwiązywanie ramek dopasowuje UUID obrazu i pełną tożsamość artefaktu, a nie nazwę pliku źródłowego. Ponowny build tego samego kodu może mieć inne UUID. Prześlij dokładnie ten pakiet dSYM, a nie cały katalog builda.

Sprawdź dane odczytane z LogBrew

Przefiltruj listę problemów, używając tego samego zakresu co w aplikacji. Ten przykład wybiera problemy unresolved. Problem rozwiązany lub zarchiwizowany się nie pojawi.
Odpowiedź listy wskazuje zgrupowany problem. Odczytaj jego szczegóły, aby LogBrew rozwiązał ramki po swojej stronie.
Pasujący artefakt dodaje obiekt symbolication. Ten przykład pokazuje wybrane pola problemu z rozwiązaną ramką, a nie pełną odpowiedź.

Odczytaj dowody awarii

Każda ramka ma własny status. Pole symbolication.status używa tych samych wartości: W notatkach zostaw nierozwiązaną ramkę jako nierozwiązaną. Nie zgłaszaj jej jako pustego stosu. LogBrew rozwiązuje ramki, gdy odczytujesz problem. dSYM przesłany później może rozwiązać ramki wcześniejszego zdarzenia. Nie może dodać ramek, których zdarzenie nie zarejestrowało. Ramka aplikacji zawęża szukanie w kodzie, ale nie dowodzi przyczyny. Breadcrumby, łańcuch wyjątków i dowody ze śladu znajdziesz w analizie problemu:
W tej odpowiedzi ramka z source: "symbolicated" pochodzi z przesłanego artefaktu. Ramka z source: "captured" to miejsce, które wysłała aplikacja. Pola odpowiedzi opisuje strona Zbadaj problem. Przy każdym odczycie zachowaj pełny zakres: projekt, wydanie, środowisko i usługę. Nie rozszerzaj nieudanego wyszukiwania na inne projekty.

Sprawdź konfigurację produkcyjną

Wywołaj zatwierdzony testowy błąd we wdrożonym buildzie. Nigdy nie używaj działania klienta jako wyzwalacza. Sprawdzaj punkty po kolei i zatrzymaj się przy pierwszym niepowodzeniu:
  1. Tożsamość w aplikacji zgadza się z tożsamością przesłanego artefaktu.
  2. Kolejne uruchomienie wysyła ponownie jedno potwierdzone zdarzenie, bez odrzuconych i bez oczekujących raportów.
  3. Lista problemów w tym zakresie zwraca problem testowy z oczekiwanym stanem obsłużenia.
  4. Oczekiwana ramka aplikacji zostaje rozwiązana.
  5. Kolejne czyste uruchomienie nie dodaje następnego wystąpienia.

Bezpiecznie przywróć działanie

Ogólną analizę problemów opisuje strona Zbadaj problem przez API.