Zbieranie i interpretowanie danych o błędach

Dane o błędach i zdarzeniach są codziennie przekazywane do usługi Azure Sphere Security Service. Każdy, kto ma dostęp do określonego wykazu, może pobrać dane dla tego wykazu. Raport obejmuje wszystkie urządzenia w wykazie.

Każdy raport zawiera maksymalnie 1000 zdarzeń lub 14 dni danych, w zależności od tego, co zostanie osiągnięte jako pierwsze. Dane mogą być zapisywane w pliku lub przesyłane do skryptu lub aplikacji. Funkcja CLI może zwrócić tylko 1000 zdarzeń. Użyj publicznego interfejsu API Azure Sphere, aby określić maksymalną liczbę zdarzeń zwracanych na stronie.

Dane dotyczące błędów i innych zdarzeń wpływających na urządzenia można pobrać w następujący sposób:

Nie są zbierane żadne dane raportowania błędów z aplikacji RTApps. Jeśli chcesz rejestrować błędy z aplikacji RTApps, musisz zaimplementować komunikację międzyrdzeniową, aby przekazywać błędy z aplikacji RTApps do aplikacji wysokiego poziomu, z której dane o błędach mogą być rejestrowane w usługach sieciowych.

Typy dostępnych danych

Dane zwrócone dla każdego błędu lub zdarzenia obejmują:

Danych Opis
Identyfikator urządzenia Identyfikator urządzenia, na którym wystąpiło zdarzenie.
Typ zdarzenia Czy wydarzenie było zaplanowane, czy nieplanowane. Aktualizacje systemu operacyjnego i aplikacji są traktowane jako zdarzenia planowane, natomiast błędy są nieplanowanymi zdarzeniami.
Zajęcia z wydarzeń Składnik oprogramowania, w którym wystąpiło zdarzenie: system operacyjny lub aplikacja.
Liczba zdarzeń Liczba wystąpień zdarzenia w okresie rozdzielanym przez godzinę rozpoczęcia i godzinę zakończenia.
Opis Informacje o zdarzeniu. To pole jest ogólne i różni się w zależności od zdarzenia i jego źródła. W przypadku aplikacji może zawierać kod wyjścia, stan sygnału i kod sygnału, ale dokładna zawartość pola nie jest ustalona. Zawiera ona informacje o zdarzeniu i pochodzi z pierwszego wystąpienia zdarzenia w oknie czasowym.
Godzina rozpoczęcia Data i godzina (w czasie UTC), w którym rozpoczął się okno zdarzenia.
Godzina zakończenia Data i godzina (w czasie UTC), w którym zakończyło się okno zdarzenia.

Godzina rozpoczęcia i godzina zakończenia określają przedział czasu, w którym dane dotyczące zdarzeń są agregowane. Okno dla każdej zagregowanej grupy zdarzeń może wynosić do 24 godzin, a maksymalnie 8 wystąpień w każdym oknie czasowym.

Zdarzenia aplikacji

Zdarzenia aplikacji obejmują aktualizacje aplikacji ładowane w chmurze oraz awarie, wyjścia i inne typy awarii aplikacji.

Aktualizacje aplikacji są zdarzeniami planowanymi. W przypadku zdarzenia AppUpdate pole Opis zawiera AppUpdate.

Awarie aplikacji, wyjścia, awarie uruchamiania i podobne zdarzenia to nieplanowane zdarzenia. W przypadku nieplanowanego zdarzenia zawartość pola Opis zależy od aplikacji, która napotkała zdarzenie. W poniższej tabeli wymieniono pola, które mogą znajdować się w polu Opis dla nieplanowanego zdarzenia.

Danych Opis
exit_status lub exit_code Zamknij stan lub kod zgłoszony przez aplikację.
signal_status Liczba całkowita opisująca wysoką przyczynę awarii zwróconą przez system operacyjny. Listę statusów można znaleźć w dokumentacji man 7 lub innych zasobach systemu Linux.
signal_code Liczba całkowita wskazująca szczegółowy stan awarii w obrębie stanu sygnału nadrzędnego. Szczegółowe informacje można znaleźć w dokumentacji man 7 lub innych zasobach systemu Linux.
component_id Identyfikator GUID składnika oprogramowania, który uległ awarii.
image_id Identyfikator GUID obrazu uruchomionego w momencie wystąpienia błędu.

Konkretne informacje w opisie AppCrash zależą od źródła awarii. W przypadku większości awarii opis wygląda podobnie do następującego:

AppCrash (exit_status=11; signal_status=11; signal_code=3; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=7053e7b3-d2bb-431f-8d3a-173f52db9675)

W niektórych przypadkach awaria wyzwala dodatkowe dane o błędach, takie jak poniższe, które uzupełniają dane w poprzednim przykładzie:

AppCrash (pc=BEEED2EE; lr=BEEED2E5; sp=BEFFDE58; signo=11; errno=0; code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; pc_modulename+offset=appname+80000; lr_modulename+offset=app+100CC)

Danych Opis
Komputer Licznik programu. Wskazuje adres instrukcji, która spowodowała awarię.
Lr Zarejestruj link. Być może wskazuje adres zwrotny w funkcji wywołującej.
Sp Wskaźnik stosu. Wskazuje górną część stosu wywołań.
signo Sygnał POSIX. Wskazuje typ błędu.
Errno POSIX errno. Oznacza błąd.
Kod Wskazuje szczegółowy stan awarii w obrębie stanu sygnału nadrzędnego.
component_id Identyfikator GUID składnika oprogramowania, który uległ awarii.
pc_modulename+przesunięcie Nazwa modułu i przesunięcie do modułu zawierającego kod, w którym wystąpiła awaria.
lr_modulename+przesunięcie Nazwa modułu i przesunięcie do modułu, który mógł być funkcją wywołującą.

Interpretowanie appcrashes

Większość informacji na temat funkcji AppCrash można znaleźć w signal_status i signal_code. Wykonaj następujące czynności:

  1. Korzystając z dokumentacji man 7 dla signal_status, najpierw spójrz na tabelę z etykietą "Numerowanie sygnału dla sygnałów standardowych". W kolumnie x86/ARM wyszukaj wartość przypisaną do signal_status w raporcie csvo błędach. Po znalezieniu zwróć uwagę na odpowiednią nazwę sygnału w skrajnej lewej kolumnie.
  2. Przewiń w górę do tabeli z etykietą "Sygnały standardowe". Dopasuj wcześniej określoną nazwę sygnału i użyj tabeli, aby zebrać więcej informacji o tym, co wskazuje sygnał.
  3. W dokumentacji man 7 dla signal_code i nazwy sygnału, którą wcześniej znaleziono, znajdź odpowiednią listę si_codes.
  4. Użyj wartości przypisanej do signal_code w pliku raportu csv o błędach, aby określić, który kod odpowiada komunikatowi o błędzie.

Rozważmy na przykład następujący opis appcrash:

AppCrash (exit_status=11; signal_status=11; signal_code=3; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=7053e7b3-d2bb-431f-8d3a-173f52db9675)

Korzystając z dokumentacji man 7, można odkryć następujące dodatkowe informacje na temat AppCrash:

  1. Sygnały są opisane w 10 sekcji opisu strony Signal man. Signal_status wartości 11 odpowiada sygnałowi SIGSEGV.
  2. Funkcja SIGSEGV wskazuje, że wystąpiło nieprawidłowe odwołanie do pamięci (często może to być wskaźnik null).
  3. SI_Codes opisano w trzeciej sekcji opisu strony człowieka SigAction dla każdego signal_status. Na stronie nie ma numeru indeksu dla każdego si_code, jednak można zliczyć wartości z każdej kategorii signal_status rozpoczynającej się od indeksu 1. Patrząc na listę si_codes sigsegv (rozpoczynając od indeksu 1), widać, że trzeci odpowiada SEGV_BNDERR.
  4. SEGV_BNDERR wskazuje, że wystąpiło sprawdzanie powiązane adresu, którego adres nie powiodł się.

Uwaga

Często spotykane AppCrash zawiera wartość signal_status 9, która jest sygnałem SIGKILL, wraz z SEND_SIG_PRIV si_code. Ten stan oznacza, że system operacyjny zabił aplikację, ponieważ przekroczył limit użycia pamięci. Aby dowiedzieć się więcej o limitach pamięci aplikacji, zobacz Używanie pamięci w aplikacjach wysokiego poziomu.

Interpretowanie obiektów AppExits

Gdy aplikacja kończy działanie bez błędu, pola signal_status i signal_code nie są obecne, a zamiast exit_status opis zawiera kod wyjścia:

AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=0a7cc3a2-f7c2-4478-8b02-723c1c6a85cd)

Funkcja AppExits może wystąpić między innymi z kilku powodów, takich jak aktualizacja aplikacji, odłączenie urządzenia lub użycie interfejsu API wyłączania zasilania. Ważne jest, aby zaimplementować kody wyjścia , aby można było uzyskać wgląd w przyczyny działania funkcji AppExit.

Aby interpretować wyrażenie AppExits, użyj wartości exit_code w polu Opis raportu o błędach. Jeśli aplikacja zwraca kod wyjścia, możesz użyć wartości exit_code w raporcie o błędach, aby określić, gdzie i kiedy wystąpił błąd. Za pomocą tej wartości wyszukaj w kodzie aplikacji, aby sprawdzić, który komunikat kodu zakończenia odpowiada wartości podanej w raporcie o błędach. Następnie sprawdź, która funkcja w aplikacji zwróciła komunikat kodu zakończenia i dlaczego tak się stało. Wyświetlając instrukcję zwrotu i jej kontekst, można odkryć przyczynę błędu.

Zdarzenia systemu operacyjnego

Dane o błędach obejmują również podstawowe zdarzenia systemu operacyjnego i sprzętu, które mogą mieć wpływ na aplikację, powodując jej niepowodzenie lub ponowne uruchomienie. Do takich zdarzeń mogą należą następujące zdarzenia:

  • Nieplanowane ponowne uruchomienie urządzenia spowodowane błędami jądra
  • Aktualizacje systemu operacyjnego w chmurze
  • Przejściowe problemy sprzętowe

Dane zawierają zdarzenia systemu operacyjnego, które ułatwiają ustalenie, czy błędy aplikacji są wynikiem problemu z systemem operacyjnym lub sprzętem, czy też odzwierciedlają problemy z samą aplikacją. Jeśli dane o zdarzeniu wskazują, że urządzenie zostało uruchomione w trybie awaryjnym, być może nie można uruchomić aplikacji.

Eksplorowanie danych o błędach

Jeśli planujesz opracowanie skryptów lub narzędzi do analizowania danych o błędach, ale nie masz dużej liczby dostępnych urządzeń do zgłaszania błędów, możesz użyć przykładowych aplikacji Azure Sphere, aby wygenerować takie dane do testowania. W przykładzie samouczków/raportowania błędów w funkcji repo w usłudze Azure Sphere wyjaśniono , jak analizować błędy zgłoszone w przypadku awarii aplikacji. Postępuj zgodnie z instrukcjami w pliku readme, aby utworzyć próbkę przy użyciu programu Visual Studio, Visual Studio Code lub wiersza polecenia.

Po wdrożeniu aplikacji z poziomu wiersza polecenia bez debugera system operacyjny uruchamia ją ponownie za każdym razem, gdy kończy się niepowodzeniem. Podobne zdarzenia są agregowane, dzięki czemu jedno często upadające urządzenie nie maskuje błędów innych, a maksymalna liczba to osiem wystąpień w każdym oknie czasowym. Przykład można wdrożyć z wiersza polecenia bez debugowania w następujący sposób:

az sphere device sideload deploy --image-package <path to image package for the app>

Generowanie i pobieranie raportu o błędach

Dane o błędach i zdarzeniach są codziennie przekazywane do usługi Azure Sphere Security Service. Upewnij się, że urządzenie Azure Sphere jest połączone z Internetem za pomocą sieci Wi-Fi lub Ethernet do komunikowania się z usługą zabezpieczeń Azure Sphere.

  1. Uruchom następujące polecenie, aby pobrać raport do pliku CSV:

    az sphere catalog download-error-report --destination error.csv
    
  2. Otwórz pobrany plik CSV i poszukaj identyfikatora składnika. Powinien zostać wyświetlony opis błędu podobny do następującego:

    AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=6d2646aa-c0ce-4e55-b7d6-7c206a7a6363)

Do raportowania błędów możesz również użyć publicznego interfejsu API Azure Sphere .

Uwaga

  • Może upłynąć do 24 godzin, aż ostatnio zgłoszone zdarzenia będą dostępne do pobrania.
  • Jeśli zdarzenie lub błąd wystąpi, zanim urządzenie połączy się z serwerem NTP, sygnatura czasowa zdarzenia zawartego w telemetrii przekazanej do as3 może być nieprawidłowa. Zostanie to odzwierciedlone w nieprawidłowym wpisie w kolumnie StartTime w kolejnym raporcie pobranym z as3. W takiej sytuacji należy użyć pola Godzina zakończenia raportu, aby pomóc w oszacowaniu, kiedy zdarzenie miało miejsce. To pole zawiera godzinę, kiedy usługi w chmurze otrzymały przekazaną telemetrię i zawsze będą miały prawidłową datę.

Formatowanie danych o błędach

Sygnatury czasowe i kolumny danych w pliku raportu o błędach są sformatowane inaczej niż w typowym pliku CSV. Jeśli chcesz wyświetlić wyniki w programie Excel, możesz sformatować dane, tworząc nowe kolumny i dodając formuły niestandardowe.

Aby sformatować sygnatury czasowe w wyeksportowanym pliku CSV do pracy z programem Excel:

  1. Utwórz nową kolumnę Sygnatura czasowa i utwórz dla niej format niestandardowy:

    yyyy/mm/dd hh:mm:ss

  2. Dodaj następującą formułę do komórek w nowej kolumnie Sygnatura czasowa, zmieniając wartość komórki F2 zgodnie z kolumną i wierszem:

    =(DATEVALUE(LEFT(RawErrorReport!F2,10))+TIMEVALUE(RIGHT(RawErrorReport!F2,8)))

Aby podzielić pole Opis na osobne kolumny, wykonaj następujące czynności, zmieniając wartość komórki F2 zgodnie z kolumną i wierszem:

  1. Utwórz nową kolumnę o nazwie Nazwa krótka lub podobna i dodaj do komórek następującą formułę:

    =TRIM(LEFT(F2,FIND("(",F2)-1))

  2. Utwórz kolumny, w których nagłówki wiersza1 mają takie same nazwy jak wartości parametrów, i dodaj następującą formułę do komórek w każdej z kolumn:

    =IF(ISERROR(FIND("; " & H$1 & "=", SUBSTITUTE($F2,"(","; "))), "", MID($F2, FIND("; " & H$1 & "=", SUBSTITUTE($F2,"(","; ")) + (LEN(H$1) + 2), FIND("; ", SUBSTITUTE($F2,")","; "), FIND("; " & H$1 & "=", SUBSTITUTE($F2,"(","; "))) - FIND("; " & H$1 & "=", SUBSTITUTE($F2,"(","; ")) - (LEN(H$1) + 2)))