Compartir vía


Recopilación e interpretación de los datos de error

Importante

Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).

Los datos de errores y eventos se cargan diariamente en el servicio de seguridad de Azure Sphere. Cualquier persona que tenga acceso a un inquilino determinado podrá descargar los datos de ese inquilino. El informe abarca todos los dispositivos del inquilino.

Cada informe contiene un máximo de 1000 eventos o 14 días de datos, lo que se alcanza primero. Los datos se pueden escribir en un archivo o bien canalizar a un script o una aplicación. La CLI solo puede devolver 1000 eventos. Use la API pública de Azure Sphere 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 errores y eventos notificados por los dispositivos del inquilino actual.

  • Mediante la API pública de Azure Sphere 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 errores de las RTApps a la aplicación de alto nivel, desde la que se pueden registrar los datos de error en los servicios de red. Consulte Comunicación con una aplicación de alto nivel y Comunicación con una aplicación con respuesta en tiempo real para obtener más información.

Tipos de datos disponibles

Entre los datos devueltos para cada error o evento se incluyen los siguientes:

Data Descripción
Id. de dispositivo Identificador del dispositivo que encontró el evento.
Tipo de evento Indica si el evento fue planeado o no planeado. Las actualizaciones del sistema operativo y de las aplicaciones se consideran eventos planeados, en tanto que los errores son eventos no planeados.
Clase de eventos Componente de software que encontró el evento: sistema operativo o aplicación.
Recuento de eventos Número de veces que se ha producido el evento dentro del período delimitado por StartTime y EndTime.
Descripción Información sobre el evento. Este campo es genérico y varía según el evento y su origen. En el caso de 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 procede de la primera aparición del evento en el período de tiempo.
Hora de inicio Fecha y hora (en formato UTC) en que se inició la ventana de eventos.
Hora de finalización Fecha y hora (en formato UTC) en que finalizó la ventana de eventos.

Las horas de inicio y de finalización definen una ventana o período de tiempo durante la cual se agregan los datos de los eventos. 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 la 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. En el caso de un evento AppUpdate, el campo de descripción contiene AppUpdate.

Los bloqueos de la aplicación, las salidas, los errores de inicio y otros eventos similares son eventos no planeados. En un evento no planeado, el contenido del campo de descripción depende de la aplicación que detectó el evento. En la tabla siguiente se enumeran los campos que pueden encontrarse en el campo de descripción de un evento no planeado.

Data Descripción
exit_status o exit_code Estado o código de salida indicado por la aplicación.
signal_status Entero que describe el motivo general del bloqueo, devuelto por el sistema operativo. Puede encontrar una lista de los estados en la documentación de Man 7 o en otros recursos de Linux.
signal_code Entero que indica el estado de bloqueo detallado dentro del estado de la señal primaria. 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 bloqueó.
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. En la mayoría de los bloqueos, la descripción tiene un aspecto similar al 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 los siguientes, que complementan 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; pc_modulename+offset=appname+80000; lr_modulename+offset=app+100CC)

Data Descripción
pc Contador del programa. Apunta a la dirección de la instrucción que desencadenó el bloqueo.
lr Vincular registro. Posiblemente apunta a la dirección de retorno de la función de llamada.
sp Puntero de pila. Apunta a la parte superior de la pila de llamadas.
signo Señal POSIX. Indica el tipo de error.
errno POSIX errno. Indica un error.
code Indica el estado detallado del bloqueo dentro del estado de la señal primaria.
component_id GUID del componente de software que se bloqueó.
pc_modulename+desplazamiento Nombre del módulo y desplazamiento en el módulo que contiene el código donde se produjo el bloqueo.
lr_modulename+desplazamiento Nombre del módulo y desplazamiento en el módulo que podría haber sido la función que llama.

Interpretación de AppCrashes

Puede encontrar la mayoría de la información sobre un AppCrash en el signal_status y signal_code. Siga estos pasos:

  1. Con la documentación de Man 7 para signal_status, examine primero la tabla denominada "Numeración de señal para señales estándar". En la columna x86/ARM, busque el valor asignado al signal_status en el informe csvde errores . Una vez encontrado, anote el nombre de señal correspondiente en la columna situada más a la izquierda.
  2. Desplácese hacia arriba hasta la tabla con la etiqueta "Señales estándar". Coincide con el nombre de signal determinado anteriormente y usa la tabla para recopilar más información sobre lo que indica la señal.
  3. En la documentación de Man 7 para signal_code y el nombre de signal que encontró anteriormente, busque la lista correspondiente de si_codes.
  4. Use el valor asignado al signal_code en el archivo de informe csv de errores para 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 descubrir la siguiente información adicional sobre AppCrash:

  1. Las señales se describen en la sección 10 de la descripción de la página Signal man. Un signal_status de valor 11 corresponde a una señal SIGSEGV.
  2. SIGSEGV indica que se produjo una referencia de memoria no válida (a menudo puede ser un puntero nulo).
  3. SI_Codes se describen en la tercera sección de la descripción de la página man SigAction para cada signal_status. Aunque la página no muestra un número de índice para cada si_code, puede contar desde cada categoría de signal_status a partir del índice 1. Al examinar la lista de si_codes para SIGSEGV (a partir del índice 1), puede ver que la tercera coincide con un SEGV_BNDERR.
  4. SEGV_BNDERR indica que se produjo una comprobación enlazada de dirección con error.

Nota:

Un appCrash encontrado normalmente incluye un valor de 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 mató a 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 valor de 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 varias razones, como una actualización de la aplicación, un dispositivo que se está desconectando 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 valor 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 del 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 de sistema operativo subyacentes que pueden afectar a la aplicación provocando su error o reinicio. Entre estos eventos se pueden incluir los siguientes:

  • Reinicios de dispositivos no planeados provocados por errores de kernel
  • Actualizaciones de Cloud OS
  • Problemas transitorios de hardware

Los eventos del sistema operativo se incluyen en los datos para ayudarle a determinar si los errores de aplicación son el resultado de un problema de hardware o sistema operativo o reflejan problemas con la propia aplicación. Si los datos de evento muestran que un dispositivo arrancó en modo seguro, 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 realizar pruebas. En el ejemplo Tutorials/ErrorReporting del repositorio de ejemplos de Azure Sphere 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 ocho repeticiones por período de tiempo. Puede implementar el ejemplo desde la línea de comandos sin depurar, como se indica 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 errores y eventos se cargan diariamente en el servicio de seguridad de Azure Sphere. Asegúrese de que el dispositivo de Azure Sphere está conectado a Internet mediante Wi-Fi o Ethernet para comunicarse con el servicio de seguridad de Azure Sphere.

  1. Ejecute el siguiente comando para descargar el informe en un archivo CSV:

    azsphere tenant download-error-report --destination error.csv
    
  2. Abra el archivo CSV descargado y busque el identificador del componente. Aparecerá una descripción de error similar a la que se muestra a continuación:

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

También puede usar la API pública de Azure Sphere para los informes de errores.

Nota:

  • Los eventos notificados recientemente pueden tardar hasta 24 horas en estar disponibles para su descarga.
  • Si se produce un evento o error antes de que el dispositivo se conecte con un servidor NTP, la marca de tiempo del evento contenido en la telemetría cargada en AS3 puede ser incorrecta. Esto se reflejará en una entrada incorrecta en la columna StartTime del informe posterior descargado de AS3. En esta situación, use el campo EndTime del informe para ayudar a calcular cuándo se produjo el evento. Este campo contiene la hora en que los servicios en la nube recibieron la telemetría cargada y siempre tendrán una fecha válida.

Formato de 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 dar formato a los datos creando nuevas columnas y agregando fórmulas personalizadas.

Para dar formato a las marcas de tiempo del archivo CSV exportado y trabajar con Excel:

  1. Cree una nueva columna de marca de tiempo y cree un formato personalizado para ella:

    yyyy/mm/dd hh:mm:ss

  2. Agregue la siguiente fórmula a las celdas de la nueva columna de marca de tiempo, cambiando el valor de la celda F2 para que coincida con su columna y fila:

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

Para dividir el campo de descripción en columnas independientes, siga estos pasos, cambiando el valor de la celda F2 para que coincida con su columna y fila:

  1. Cree una nueva columna denominada Nombre_corto u otro nombre similar, y agregue la siguiente fórmula a las celdas:

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

  2. Cree columnas en las que los encabezados de la fila 1 tengan los mismos nombres que los valores de parámetro y agregue la siguiente fórmula 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)))