Foutgegevens verzamelen en interpreteren
Belangrijk
Dit is de Documentatie voor Azure Sphere (verouderd). Azure Sphere (verouderd) wordt op 27 september 2027 buiten gebruik gesteld en gebruikers moeten tegen deze tijd migreren naar Azure Sphere (geïntegreerd). Gebruik de versiekiezer boven de inhoudsweergave om de Documentatie van Azure Sphere (geïntegreerd) weer te geven.
Fout- en gebeurtenisgegevens worden dagelijks geüpload naar de Azure Sphere-beveiligingsservice. Iedereen die toegang heeft tot een bepaalde tenant, kan vervolgens de gegevens voor die tenant downloaden. In het rapport worden alle apparaten in de tenant behandeld.
Elk rapport bevat maximaal 1000 gebeurtenissen of 14 dagen aan gegevens, afhankelijk van wat het eerst wordt bereikt. Gegevens kunnen naar een bestand worden geschreven of doorgesluisd naar een script of toepassing. De CLI kan slechts 1000 gebeurtenissen retourneren. Gebruik de openbare API van Azure Sphere om het maximum aantal gebeurtenissen op te geven dat op de pagina wordt geretourneerd.
U kunt op de volgende manieren gegevens downloaden over de fouten en andere gebeurtenissen die van invloed zijn op uw apparaten:
Gebruik de opdracht azsphere tenant download-error-report. Een CSV-bestand met informatie over fouten en gebeurtenissen die zijn gerapporteerd door apparaten in de huidige tenant, wordt gedownload.
Met behulp van de openbare Azure Sphere-API voor foutrapportage. Het API-eindpunt retourneert een JSON-object dat u kunt parseren op basis van uw behoeften.
Er worden geen foutrapportagegegevens verzameld van RTApps. Als u fouten van RTApps wilt registreren, moet u communicatie tussen kernen implementeren om fouten van de RTApps te communiceren met de toepassing op hoog niveau, waaruit de foutgegevens kunnen worden vastgelegd in netwerkservices. Zie Communiceren met een toepassing op hoog niveau en communiceren met een realtime geschikte toepassing voor meer informatie.
Beschikbare typen gegevens
De gegevens die worden geretourneerd voor elke fout of gebeurtenis, bevatten het volgende:
'Gegevens | Beschrijving |
---|---|
Apparaat-ID | Id van het apparaat waarop de gebeurtenis is aangetroffen. |
Gebeurtenistype | Of de gebeurtenis gepland of ongepland is. Besturingssysteem- en app-updates worden beschouwd als geplande gebeurtenissen, terwijl fouten ongeplande gebeurtenissen zijn. |
Gebeurtenisklasse | Softwareonderdeel dat de gebeurtenis heeft aangetroffen: besturingssysteem of toepassing. |
Aantal gebeurtenissen | Aantal keren dat de gebeurtenis is opgetreden binnen de periode die is gescheiden door StartTime en EndTime. |
Beschrijving | Informatie over de gebeurtenis. Dit veld is algemeen en varieert afhankelijk van de gebeurtenis en de bron. Voor toepassingen kan deze de afsluitcode, de signaalstatus en de signaalcode bevatten, maar de exacte inhoud van het veld is niet opgelost. Dit bevat informatie over de gebeurtenis en is afkomstig van het eerste exemplaar van de gebeurtenis in het tijdvenster. |
Begintijd | Datum en tijd (in UTC) waarop het gebeurtenisvenster is begonnen. |
Eindtijd | Datum en tijd (in UTC) waarop het gebeurtenisvenster is beëindigd. |
De begin- en eindtijd definiëren een tijdvenster waarin gebeurtenisgegevens worden samengevoegd. Het venster voor elke geaggregeerde groep gebeurtenissen kan maximaal 24 uur duren en het maximum is 8 exemplaren per tijdvenster.
Toepassingsgebeurtenissen
Toepassingsgebeurtenissen omvatten app-updates die in de cloud zijn geladen, samen met crashes, exits en andere soorten toepassingsfouten.
Toepassingsupdates zijn geplande gebeurtenissen. Voor een AppUpdate-gebeurtenis bevat AppUpdate
het veld Beschrijving .
Toepassing loopt vast, sluit af, opstartfouten en vergelijkbare gebeurtenissen zijn ongeplande gebeurtenissen. Voor een niet-geplande gebeurtenis is de inhoud van het veld Beschrijving afhankelijk van de toepassing die de gebeurtenis heeft aangetroffen. De volgende tabel bevat de velden die mogelijk aanwezig zijn in het veld Beschrijving voor een niet-geplande gebeurtenis.
'Gegevens | Beschrijving |
---|---|
exit_status of exit_code | Sluit de status of code af die door de toepassing is gerapporteerd. |
signal_status | Geheel getal dat de reden voor de crash op hoog niveau beschrijft, geretourneerd door het besturingssysteem. U vindt een lijst met statussen in de Man 7-documentatie of andere Linux-resources. |
signal_code | Geheel getal dat de gedetailleerde crashstatus binnen de bovenliggende signaalstatus aangeeft. Zie de Man 7-documentatie of andere Linux-resources voor meer informatie. |
component_id | GUID van het softwareonderdeel dat is vastgelopen. |
image_id | GUID van de afbeelding die werd uitgevoerd op het moment van de fout. |
De specifieke informatie in een AppCrash-beschrijving is afhankelijk van de bron van de crash. Voor de meeste crashes ziet de beschrijving er ongeveer als volgt uit:
AppCrash (exit_status=11; signal_status=11; signal_code=3; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=7053e7b3-d2bb-431f-8d3a-173f52db9675)
In sommige gevallen activeert een crash aanvullende foutgegevens, zoals het volgende, die de gegevens in het vorige voorbeeld aanvullen:
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)
'Gegevens | Beschrijving |
---|---|
PC | Programmateller. Verwijst naar het adres van de instructie die de crash heeft geactiveerd. |
Lr | Koppeling registreren. Verwijst mogelijk naar het adres van de afzender in de aanroepende functie. |
Sp | Stack Pointer. Verwijst naar de bovenkant van de aanroepstack. |
signo | POSIX-signaal. Geeft het fouttype aan. |
errno | POSIX errno. Geeft een fout aan. |
code | Geeft de gedetailleerde crashstatus binnen de bovenliggende signaalstatus aan. |
component_id | GUID van het softwareonderdeel dat is vastgelopen. |
pc_modulename+offset | Naam van de module en offset in de module die de code bevat waarin de crash is opgetreden. |
lr_modulename+offset | Naam van de module en verschuiving in de module die mogelijk de aanroepende functie is. |
AppCrashes interpreteren
U vindt de meeste informatie over een AppCrash in de signal_status en signal_code. Volg vervolgens deze stappen:
- Met behulp van de Man 7-documentatie voor signal_status bekijkt u eerst de tabel met het label 'Signaalnummering voor standaardsignalen'. Zoek in de kolom x86/ARM naar de waarde die is toegewezen aan de signal_status in het foutenrapport
csv
. Zodra u deze hebt gevonden, noteert u de bijbehorende signaalnaam in de meest linkse kolom. - Schuif omhoog naar de tabel met het label 'Standaardsignalen'. Komt overeen met de eerder vastgestelde signaalnaam en gebruik de tabel om meer informatie te verzamelen over wat het signaal aangeeft.
- Zoek in de Man 7-documentatie voor signal_code en de signaalnaam die u eerder hebt gevonden de bijbehorende lijst met si_codes.
- Gebruik de waarde die is toegewezen aan de signal_code in het foutenrapportbestand
csv
om te bepalen welke code overeenkomt met het foutbericht.
Denk bijvoorbeeld aan de volgende Beschrijving van 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)
Met behulp van de Man 7-documentatie kunt u de volgende aanvullende informatie over de AppCrash ontdekken:
- Signalen worden beschreven in het 10e gedeelte van de beschrijving van de signal man-pagina. Een signal_status van waarde 11 komt overeen met een SIGSEGV-signaal.
- SIGSEGV geeft aan dat er een ongeldige geheugenreferentie is opgetreden (dit kan vaak een null-aanwijzer zijn).
- SI_Codes worden beschreven in het derde gedeelte van de beschrijving van de sigAction man-pagina voor elke signal_status. Hoewel op de pagina geen indexnummer voor elke si_code wordt vermeld, kunt u tellen vanaf elke signal_status categorie beginnend bij index 1. Als u de lijst met si_codes voor SIGSEGV (vanaf index 1) bekijkt, ziet u dat de derde overeenkomt met een SEGV_BNDERR.
- SEGV_BNDERR geeft aan dat er een mislukte adresgrenscontrole is opgetreden.
Notitie
Een veelgebruikte AppCrash bevat een signal_status waarde van 9, een SIGKILL-signaal, samen met de SEND_SIG_PRIV si_code
. Deze status geeft aan dat het besturingssysteem de toepassing heeft gedood omdat deze de limiet voor het geheugengebruik heeft overschreden. Zie Geheugengebruik in toepassingen op hoog niveau voor meer informatie over geheugenlimieten voor toepassingen op hoog niveau.
AppExits interpreteren
Wanneer een app zonder fouten wordt afgesloten, zijn de velden signal_status en signal_code niet aanwezig. In plaats van een exit_status bevat de beschrijving een afsluitcode:
AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=0a7cc3a2-f7c2-4478-8b02-723c1c6a85cd)
AppExits kan om een aantal redenen optreden, zoals een toepassingsupdate, een apparaat dat wordt losgekoppeld of het gebruik van de power-down-API, onder andere. Het is belangrijk om afsluitcodes te implementeren, zodat u inzicht krijgt in de redenen voor een AppExit.
Als u AppExits wilt interpreteren, gebruikt u de exit_code waarde in het veld Beschrijving van het foutenrapport. Als uw app een afsluitcode retourneert, kunt u de waarde van de exit_code in het foutenrapport gebruiken om te bepalen waar of wanneer de fout is opgetreden. Zoek met deze waarde in de toepassingscode om te zien welk afsluitcodebericht overeenkomt met de waarde in het foutenrapport. Zoek vervolgens welke functie in de toepassing het afsluitcodebericht heeft geretourneerd en waarom dit is gedaan. Als u de retourinstructie en de bijbehorende context bekijkt, kunt u mogelijk de reden voor de fout detecteren.
Gebeurtenissen van het besturingssysteem
Foutgegevens omvatten ook onderliggende besturingssysteem- en hardware-gebeurtenissen die van invloed kunnen zijn op uw toepassing door deze te laten mislukken of opnieuw te starten. Dergelijke gebeurtenissen kunnen het volgende omvatten:
- Niet-gepland apparaat wordt opnieuw opgestart vanwege kernelfouten
- Updates voor cloudbesturingssystemen
- Tijdelijke hardwareproblemen
Besturingssysteemgebeurtenissen worden opgenomen in de gegevens om te bepalen of toepassingsfouten het gevolg zijn van een besturingssysteem- of hardwareprobleem of problemen met de toepassing zelf weerspiegelen. Als de gebeurtenisgegevens laten zien dat een apparaat is opgestart naar de veilige modus, kunnen uw apps mogelijk niet worden gestart.
Foutgegevens verkennen
Als u van plan bent scripts of hulpprogramma's te ontwikkelen voor het analyseren van foutgegevens, maar u geen groot aantal apparaten hebt die beschikbaar zijn voor het rapporteren van fouten, kunt u de Azure Sphere-voorbeeldtoepassingen gebruiken om dergelijke gegevens te genereren voor het testen. In de zelfstudies/ErrorReporting-voorbeeld in de opslagplaats met Azure Sphere-voorbeelden wordt uitgelegd hoe u fouten analyseert die zijn gerapporteerd wanneer de toepassing vastloopt. Volg de instructies in het leesmij-bestand om het voorbeeld te bouwen met behulp van Visual Studio, Visual Studio Code of de opdrachtregel.
Wanneer u de app implementeert vanaf de opdrachtregel zonder een foutopsporingsprogramma, wordt deze telkens opnieuw gestart wanneer deze mislukt. Vergelijkbare gebeurtenissen worden samengevoegd, zodat een vaak mislukkend apparaat fouten van anderen niet maskert en het maximum is acht exemplaren per tijdvenster. U kunt het voorbeeld als volgt implementeren vanaf de opdrachtregel zonder foutopsporing:
azsphere device sideload deploy --image-package <path to image package for the app>
Foutrapport genereren en downloaden
Fout- en gebeurtenisgegevens worden dagelijks geüpload naar de Azure Sphere-beveiligingsservice. Zorg ervoor dat het Azure Sphere-apparaat is verbonden met internet via Wi-Fi of Ethernet voor communicatie met de Azure Sphere-beveiligingsservice.
Voer de volgende opdracht uit om het rapport te downloaden naar een CSV-bestand:
azsphere tenant download-error-report --destination error.csv
Open het gedownloade CSV-bestand en zoek uw onderdeel-id. Als het goed is, ziet u een foutbeschrijving die er ongeveer als volgt uitziet:
AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=6d2646aa-c0ce-4e55-b7d6-7c206a7a6363)
U kunt ook de openbare API van Azure Sphere gebruiken voor foutrapportage.
Notitie
- Het kan tot 24 uur duren voordat onlangs gerapporteerde gebeurtenissen beschikbaar zijn om te downloaden.
- Als er een gebeurtenis of fout optreedt voordat het apparaat verbinding maakt met een NTP-server, is de tijdstempel voor de gebeurtenis die is geüpload naar AS3 mogelijk onjuist. Dit wordt weergegeven in een onjuiste vermelding in de kolom StartTime in het volgende rapport dat is gedownload van AS3. In deze situatie wordt het veld EndTime van het rapport gebruikt om te helpen bij het schatten van de gebeurtenis. Dit veld bevat de tijd waarop de cloudservices de geüploade telemetrie hebben ontvangen en altijd een geldige datum hebben.
Foutgegevens opmaken
De tijdstempels en gegevenskolommen in het foutenrapportbestand worden anders opgemaakt dan een typisch CSV-bestand. Als u de resultaten in Excel wilt weergeven, kunt u de gegevens opnieuw opmaken door nieuwe kolommen te maken en aangepaste formules toe te voegen.
De tijdstempels in het geëxporteerde CSV-bestand opmaken om te werken met Excel:
Maak een nieuwe tijdstempelkolom en maak er een aangepaste indeling voor:
yyyy/mm/dd hh:mm:ss
Voeg de volgende formule toe aan de cellen in de nieuwe kolom Timestamp en wijzig de F2-celwaarde zodat deze overeenkomt met uw kolom en rij:
=(DATEVALUE(LEFT(RawErrorReport!F2,10))+TIMEVALUE(RIGHT(RawErrorReport!F2,8)))
Als u het veld Beschrijving wilt splitsen in afzonderlijke kolommen, volgt u deze stappen en wijzigt u de F2-celwaarde zodat deze overeenkomt met uw kolom en rij:
Maak een nieuwe kolom met de naam Shortname of iets dergelijks en voeg de volgende formule toe aan de cellen:
=TRIM(LEFT(F2,FIND("(",F2)-1))
Maak kolommen waarin de rij1-koppen dezelfde namen hebben als de parameterwaarden en voeg de volgende formule toe aan de cellen in elk van de kolommen:
=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)))