Recopilación e interpretación de los datos de error
Los datos de eventos y errores se cargan diariamente en Azure Sphere Security Service. Cualquier persona que tenga acceso a un inquilino determinado puede descargar los datos de ese inquilino. El informe cubre todos los dispositivos del inquilino.
Cada informe contiene un máximo de 1000 eventos o 14 días de datos, lo que se alcance primero. Los datos se pueden escribir en un archivo o canalizar a un script o aplicación. La CLI solo puede devolver 1000 eventos. Use la API Azure Sphere pública para especificar el número máximo de eventos devueltos en la página.
Puede descargar datos sobre los errores y otros eventos que afectan a los dispositivos de las maneras siguientes:
Mediante el comando azsphere tenant download-error-report. Se descarga un archivo CSV que contiene información sobre los errores y eventos notificados por los dispositivos del inquilino actual.
Mediante el uso de Azure Sphere API pública para la generación de informes de errores. El punto de conexión de API devuelve un objeto JSON que puede analizar según sus necesidades.
No se recopilan datos de informes de errores de RTApps. Si desea registrar errores de RTApps, deberá implementar comunicaciones entre núcleos para comunicar los errores de las RTApps a la aplicación de alto nivel, desde la que los datos de error se pueden registrar en los servicios de red. Consulte Comunicación con una aplicación de alto nivel y Comunicación con una aplicación compatible en tiempo real para obtener más información.
Tipos de datos disponibles
Los datos devueltos para cada error o evento incluyen lo siguiente:
| data | Descripción |
|---|---|
| Id. de dispositivo | Identificador del dispositivo que encontró el evento. |
| Tipo de evento | Si el evento se planeó o no. Las actualizaciones del sistema operativo y de la aplicación se consideran eventos planeados, mientras que los errores son eventos no planeados. |
| Clase de eventos | Componente de software que encontró el evento: sistema operativo o aplicación. |
| Número de eventos | Número de veces que se produjo el evento dentro del período delimitado por StartTime y EndTime. |
| Descripción | Información acerca del evento. Este campo es genérico y varía en función del evento y su origen. Para las aplicaciones, puede contener el código de salida, el estado de la señal y el código de señal, pero el contenido exacto del campo no es fijo. Contiene información sobre el evento y es de la primera aparición del evento en el período de tiempo. |
| Hora de inicio | Fecha y hora (en UTC) en la que comenzó la ventana de eventos. |
| Hora de finalización | Fecha y hora (en UTC) en la que finalizó la ventana de eventos. |
La hora de inicio y la hora de finalización definen una ventana de tiempo durante la cual se agregan los datos del evento. La ventana de cualquier grupo agregado de eventos puede ser de hasta 24 horas y el máximo es de 8 repeticiones por período de tiempo.
Eventos de aplicación
Los eventos de aplicación incluyen actualizaciones de aplicaciones cargadas en la nube junto con bloqueos, salidas y otros tipos de errores de aplicación.
Las actualizaciones de aplicaciones son eventos planeados. Para un evento AppUpdate, el campo Descripción contiene AppUpdate .
Los bloqueos de la aplicación, las salidas, los errores de inicio y eventos similares son eventos no planeados. Para un evento no planeado, el contenido del campo Descripción depende de la aplicación que encontró el evento. En la tabla siguiente se enumeran los campos que pueden estar presentes en el campo Descripción de un evento no planeado.
| data | Descripción |
|---|---|
| exit_status o exit_code | Estado de salida o código notificado por la aplicación. |
| signal_status | Entero que describe el motivo de alto nivel del bloqueo, devuelto por el sistema operativo. Puede encontrar una lista de estados en la documentación de Man 7 u otros recursos de Linux. |
| signal_code | Entero que indica el estado de bloqueo detallado dentro del estado de señal principal. Consulte la documentación de Man 7 u otros recursos de Linux para obtener más información. |
| component_id | GUID del componente de software que se ha bloqueo. |
| image_id | GUID de la imagen que se estaba ejecutando en el momento del error. |
La información específica de una descripción de AppCrash depende del origen del bloqueo. Para la mayoría de los bloqueos, la descripción es similar a la siguiente:
AppCrash (exit_status=11; signal_status=11; signal_code=3; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=7053e7b3-d2bb-431f-8d3a-173f52db9675)
En algunos casos, un bloqueo desencadena datos de error adicionales, como el siguiente, que complementa los datos del ejemplo anterior:
AppCrash (pc=BEEED2EE; lr=BEEED2E5; sp=BEFFDE58; signo=11; errno=0; code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8)
Interpretación de AppCrashes
Puede encontrar la mayor parte de la información sobre un AppCrash en signal_status y signal_code. Siga estos pasos:
- Con la documentación de Man 7 signal_status, primero consulte la tabla con la etiqueta "Signal Numbering for Standard Signals" (Numeración de señales para señales estándar). En la columna x86/ARM, busque el valor asignado a la signal_status en el informe de errores
csv. Una vez encontrado, anote el nombre de señal correspondiente en la columna situada más a la izquierda. - Desplácese hacia arriba hasta la tabla con la etiqueta "Señales estándar". Coincide con el nombre de señal determinado previamente y usa la tabla para recopilar más información sobre lo que indica la señal.
- En la documentación de Man 7 para signal_code y el nombre de señal que encontró anteriormente, busque la lista correspondiente de si_codes.
- Use el valor asignado a la signal_code en el archivo de informe de errores
csvpara determinar qué código coincide con el mensaje de error.
Por ejemplo, considere la siguiente descripción de 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)
Con la documentación de Man 7, puede detectar la siguiente información adicional sobre AppCrash:
- Un signal_status de valor 11 corresponde a una señal SIGSEGV.
- SIGSEGV indica que se ha producido una referencia de memoria no válida (a menudo puede ser un puntero nulo).
- Al consultar la lista de si_codes para SIGSEGV (a partir del índice 1), puede ver que el tercero coincide con un SEGV_BNDERR.
- SEGV_BNDERR indica que se ha producido una comprobación enlazada a una dirección con error.
Nota
Un AppCrash que se encuentra normalmente incluye un signal_status de 9, que es una señal SIGKILL, junto con el SEND_SIG_PRIV si_code . Este estado indica que el sistema operativo finalizó la aplicación porque superó su límite de uso de memoria. Para más información sobre los límites de memoria de la aplicación, consulte Uso de memoria en aplicaciones de alto nivel.
Interpretación de AppExits
Cuando una aplicación se cierra sin errores, los campos signal_status y signal_code no están presentes y, en lugar de un exit_status, la descripción contiene un código de salida:
AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=0a7cc3a2-f7c2-4478-8b02-723c1c6a85cd)
AppExits puede producirse por varios motivos, como una actualización de la aplicación, un dispositivo que se desconecta o el uso de la API de apagado, entre otros. Es importante implementar códigos de salida para que pueda obtener información sobre las razones de un AppExit.
Para interpretar AppExits, use el exit_code en el campo Descripción del informe de errores. Si la aplicación devuelve un código de salida, puede usar el valor de la exit_code en el informe de errores para determinar dónde o cuándo se produjo el error. Con este valor, busque en el código de la aplicación para ver qué mensaje de código de salida corresponde al valor proporcionado en el informe de errores. A continuación, busque qué función de la aplicación devolvió el mensaje de código de salida y por qué lo hizo. Al ver la instrucción return y su contexto, es posible que pueda detectar el motivo del error.
Eventos del sistema operativo
Los datos de error también incluyen eventos de hardware y sistema operativo subyacentes que pueden afectar a la aplicación al provocar un error o un reinicio. Estos eventos pueden incluir lo siguiente:
- Reinicios de dispositivos no planeados causados por errores de kernel
- Cloud OS actualizaciones
- Problemas transitorios de hardware
Los eventos del sistema operativo se incluyen en los datos para ayudarle a determinar si los errores de la aplicación son el resultado de un problema de hardware o del sistema operativo o reflejan problemas con la propia aplicación. Si los datos del evento muestran que un dispositivo ha arrancado Caja fuerte modo, es posible que las aplicaciones no se puedan iniciar.
Exploración de los datos de error
Si tiene previsto desarrollar scripts o herramientas para analizar datos de error, pero no tiene un gran número de dispositivos disponibles para notificar errores, puede usar las aplicaciones de ejemplo de Azure Sphere para generar dichos datos para las pruebas. En el ejemplo Tutorials/ErrorReporting del repositorio Azure Sphere ejemplos se explica cómo analizar los errores notificados cuando se bloquea la aplicación. Siga las instrucciones del archivo Léame para compilar el ejemplo mediante Visual Studio, Visual Studio Code o la línea de comandos.
Al implementar la aplicación desde la línea de comandos sin un depurador, el sistema operativo la reinicia cada vez que se produce un error. Se agregan eventos similares para que un dispositivo con errores con frecuencia no enmascara los errores de otros y el máximo es de ocho repeticiones por período de tiempo. Puede implementar el ejemplo desde la línea de comandos sin depurar, como se muestra a continuación:
azsphere device sideload deploy --image-package <path to image package for the app>
Generación y descarga del informe de errores
Los datos de eventos y errores se cargan diariamente en Azure Sphere Security Service. Asegúrese de que el Azure Sphere está conectado a Internet mediante Wi-Fi o Ethernet para comunicarse con el Azure Sphere Security Service.
Ejecute el siguiente comando para descargar el informe en un archivo CSV:
azsphere tenant download-error-report --destination error.csvAbra el archivo CSV descargado y busque el identificador de componente. Debería ver una descripción del error similar a la siguiente:
AppExit (exit_code=0; component_id=685f13af-25a5-40b2-8dd8-8cbc253ecbd8; image_id=6d2646aa-c0ce-4e55-b7d6-7c206a7a6363)
También puede usar la API Azure Sphere pública para la generación de informes de errores.
Nota
Los eventos notificados recientemente pueden tardar hasta 24 horas en estar disponibles para su descarga.
Dar formato a los datos de error
Las marcas de tiempo y las columnas de datos del archivo de informe de errores tienen un formato diferente al de un archivo CSV típico. Si desea ver los resultados en Excel, puede volver a formatear los datos mediante la creación de nuevas columnas y la adición de fórmulas personalizadas.
Para dar formato a las marcas de tiempo del archivo CSV exportado para que funcionen con Excel:
Cree una nueva columna Timestamp y cree un formato personalizado para ella:
yyyy/mm/dd hh:mm:ssAgregue la fórmula siguiente a las celdas de la nueva columna Timestamp, cambiando el valor de la celda F2 para que coincida con la columna y la fila:
=(DATEVALUE(LEFT(RawErrorReport!F2,10))+TIMEVALUE(RIGHT(RawErrorReport!F2,8)))
Para dividir el campo Descripción en columnas independientes, siga estos pasos y cambie el valor de la celda F2 para que coincida con la columna y la fila:
Cree una columna denominada Shortname o similar y agregue la fórmula siguiente a las celdas:
=TRIM(LEFT(F2,FIND("(",F2)-1))Cree columnas en las que los encabezados row1 tengan los mismos nombres que los valores de parámetro y agregue la fórmula siguiente a las celdas de cada una de las columnas:
=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)))