Un informe de fallo está estructurado de la siguiente manera, y cada sección contiene información que ayuda a localizar el fallo:
1. encabezado
Describa el entorno en el que ocurrió el bloqueo, incluido el dispositivo, el sistema, la hora, la versión y otra información. como:
Incident Identifier: 6156848E-344E-4D9E-84E0-87AFD0D0AE7B
CrashReporter Key: 76f2fb60060d6a7f814973377cbdc866fffd521f
Hardware Model: iPhone8,1
Process: TouchCanvas [1052]
Path: /private/var/containers/Bundle/Application/51346174-37EF-4F60-B72D-8DE5F01035F5/TouchCanvas.app/TouchCanvas
Identifier: com.example.apple-samplecode.TouchCanvas
Version: 1 (3.0)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.example.apple-samplecode.TouchCanvas [1806]
Date/Time: 2020-03-27 18:06:51.4969 -0700
Launch Time: 2020-03-27 18:06:31.7593 -0700
OS Version: iPhone OS 13.3.1 (17D50)
2. Información de excepción
Información de excepción. Describe cómo finaliza un proceso, pero es posible que no explique completamente por qué finaliza el programa. como:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000102afb3d0
Exception Type
: Nombre de excepción de Mach (señal de terminación BSD correspondiente)Exception Codes
: Información específica del controlador de excepciones, uno o más números hexadecimales de 64 bits. Normalmente, este campo no está presente porque el sistema operativo convierte la información en información legible por humanos a través de otros campos.Exception Subtype
: Subtipo de excepciónException Message
:Información de descripción de excepciónException Note
:Excepción información adicional.- Si se incluye
EXC_CORPSE_NOTIFY
, el bloqueo no fue causado por un defecto de hardware, sino que podría ser causado por el sistema operativo o el proceso que llamó a la función abort(), lo que provocó que el proceso terminara. - Si se incluye
SIMULATED
, el proceso no falló, pero el sistema operativo puede solicitar posteriormente que se finalice el proceso. - Si se incluye
NON-FATAL CONDITION
(esto no es un bloqueo), el proceso no finalizará porque el problema al crear el informe de bloqueo no es fatal.
- Si se incluye
Termination Reason
: Motivo de la terminación. El componente del sistema finalizará el proceso cuando encuentre un error fatal y registrará la información en este campo. En este campo se pueden encontrar mensajes como firma de código no válido, bibliotecas dependientes faltantes y acceso a información sensible a la privacidad sin cadenas específicas.Triggered by Thread or Crashed Thread
: El hilo que causó la excepción.
3. Mensajes de diagnóstico
Los sistemas operativos a veces incluyen información de diagnóstico adicional en una variedad de formatos, según la causa del fallo, y no se incluyen en todos los informes de fallos. como:
Application Specific Information:
BUG IN CLIENT OF LIBDISPATCH: dispatch_sync called on queue already owned by current thread
Application Specific Information
: Un mensaje de error de trama que ocurre antes de que finalice el proceso
Termination Description
. : La terminación debido a una violación del mecanismo de vigilancia contendrá este campo que describe el motivo por el cual se activó el mecanismo de vigilancia. como:
Termination Description: SPRINGBOARD,
scene-create watchdog transgression: application<com.example.MyCoolApp>:667
exhausted real (wall clock) time allowance of 19.97 seconds
4. Retrocesos
Cada subproceso del proceso que falla se captura como un rastreo, registrando el código que se ejecuta en el subproceso cuando finaliza el proceso.
Los bloqueos causados por excepciones de idioma contienen un rastreo adicional, uno antes del primer hilo Last Exception Backtrace
.
La primera línea de cada rastreo enumera el número y el nombre del hilo. Cada línea subsiguiente representa un marco de pila en el rastreo, y cada columna del marco de pila contiene información sobre el código que se ejecutó en el momento del bloqueo. como:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 TouchCanvas 0x0000000102afb3d0 CanvasView.updateEstimatedPropertiesForTouches(_:) + 62416 (CanvasView.swift:231)
1 TouchCanvas 0x0000000102afb3d0 CanvasView.updateEstimatedPropertiesForTouches(_:) + 62416 (CanvasView.swift:231)
2 TouchCanvas 0x0000000102af7d10 ViewController.touchesMoved(_:with:) + 48400 (<compiler-generated>:0)
3 TouchCanvas 0x0000000102af80b8 @objc ViewController.touchesMoved(_:with:) + 49336 (<compiler-generated>:0)
4 UIKitCore 0x00000001ba9d8da4 forwardTouchMethod + 328
5 UIKitCore 0x00000001ba9d8e40 -[UIResponder touchesMoved:withEvent:] + 60
6 UIKitCore 0x00000001ba9d8da4 forwardTouchMethod + 328
7 UIKitCore 0x00000001ba9d8e40 -[UIResponder touchesMoved:withEvent:] + 60
8 UIKitCore 0x00000001ba9e6ea4 -[UIWindow _sendTouchesForEvent:] + 1896
9 UIKitCore 0x00000001ba9e8390 -[UIWindow sendEvent:] + 3352
10 UIKitCore 0x00000001ba9c4a9c -[UIApplication sendEvent:] + 344
11 UIKitCore 0x00000001baa3cc20 __dispatchPreprocessedEventFromEventQueue + 5880
12 UIKitCore 0x00000001baa3f17c __handleEventQueueInternal + 4924
13 UIKitCore 0x00000001baa37ff0 __handleHIDEventFetcherDrain + 108
14 CoreFoundation 0x00000001b68a4a00 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
15 CoreFoundation 0x00000001b68a4958 __CFRunLoopDoSource0 + 80
16 CoreFoundation 0x00000001b68a40f0 __CFRunLoopDoSources0 + 180
17 CoreFoundation 0x00000001b689f23c __CFRunLoopRun + 1080
18 CoreFoundation 0x00000001b689eadc CFRunLoopRunSpecific + 464
19 GraphicsServices 0x00000001c083f328 GSEventRunModal + 104
20 UIKitCore 0x00000001ba9ac63c UIApplicationMain + 1936
21 TouchCanvas 0x0000000102af16dc main + 22236 (AppDelegate.swift:12)
22 libdyld.dylib 0x00000001b6728360 start + 4
Thread 1:
0 libsystem_pthread.dylib 0x00000001b6645758 start_wqthread + 0
Thread 2:
0 libsystem_pthread.dylib 0x00000001b6645758 start_wqthread + 0
...
-
La primera columna: número del marco de la pila. Los marcos de la pila están ordenados en el orden de llamada. El marco 0 es la función que se ejecuta cuando se detiene la ejecución, el marco 1 es la función que llama al marco 0, y así sucesivamente.
-
Segunda columna: Nombre del archivo binario que está ejecutando la función
-
La tercera columna: la dirección de la instrucción de la máquina que se está ejecutando. Para una pila que no colapsa, esta es la dirección de la primera instrucción de máquina ejecutada después de que el control regresa a este marco de pila.
-
Columna 4: en un informe de fallos totalmente simbólico, el nombre de la función que se está ejecutando.
-
Lo siguiente
+数字
: es el desplazamiento de bytes desde el punto de entrada de la función hasta la instrucción actual en la función. -
(Nombre de archivo. Sufijo: número): nombre de archivo y número de línea. En algunos casos no se corresponde con el código fuente original:
- Si el nombre del archivo fuente es
<compiler-generated>
, entonces el compilador creó el código para ese marco y ese código no está en su archivo fuente. Si este es el fotograma superior del hilo que falla, mire los fotogramas de la pila anterior en busca de pistas. - Si el número de línea del archivo fuente es 0, significa que el rastreo no se asigna a una línea de código específica en el código original. Porque el compilador optimizó el código (es decir, lo introvirtió) y el código ejecutado en el momento del fallo no correspondía a la línea exacta del código original. En este punto, el nombre de la función del marco sigue siendo sólo una pista.
- Si el nombre del archivo fuente es
5. Estado del hilo
La sección Estado del subproceso enumera los registros de la CPU y sus valores del subproceso bloqueado cuando finalizó el programa. como:
Thread 0 crashed with ARM Thread State (64-bit):
x0: 0x0000000000000001 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x000000000000000f
x4: 0x00000000000001c2 x5: 0x000000010327f6c0 x6: 0x000000010327f724 x7: 0x0000000000000120
x8: 0x0000000000000001 x9: 0x0000000000000001 x10: 0x0000000000000001 x11: 0x0000000000000000
x12: 0x00000001038612b0 x13: 0x000005a102b075a7 x14: 0x0000000000000100 x15: 0x0000010000000000
x16: 0x00000001c3e6c630 x17: 0x00000001bae4bbf8 x18: 0x0000000000000000 x19: 0x0000000282c14280
x20: 0x00000001fe64a3e0 x21: 0x4000000281f1df10 x22: 0x0000000000000001 x23: 0x0000000000000000
x24: 0x0000000000000000 x25: 0x0000000282c14280 x26: 0x0000000103203140 x27: 0x00000001bacf4b7c
x28: 0x00000001fe5ded08 fp: 0x000000016d311310 lr: 0x0000000102afb3d0
sp: 0x000000016d311200 pc: 0x0000000102afb3d0 cpsr: 0x60000000
esr: 0xf2000001 Address size fault
Comprender el estado del subproceso es un tema avanzado que requiere comprensión de la interfaz binaria del programa (ABI). Consulte Escritura de código ARM64 para plataformas Apple.
Los registros proporcionan información adicional sobre fallas causadas por accesos a la memoria. Para obtener más detalles, consulte Comprender los registros del subproceso bloqueado.
6. Imágenes binarias
Imagen binaria: la sección Imagen binaria del informe de fallos enumera todo el código cargado en el proceso en el momento de la terminación (como los ejecutables de la aplicación y los marcos del sistema). Cada línea en la sección de imagen binaria representa una imagen binaria, como por ejemplo:
Binary Images:
0x102aec000 - 0x102b03fff TouchCanvas arm64 <fe7745ae12db30fa886c8baa1980437a> /var/containers/Bundle/Application/51346174-37EF-4F60-B72D-8DE5F01035F5/TouchCanvas.app/TouchCanvas
...
- La primera columna: el rango de direcciones de la imagen binaria dentro del proceso. La primera dirección es la dirección de carga del archivo binario.
- Segunda columna: nombre binario
- Columna 3: Arquitectura de CPU de la imagen binaria cargada por el sistema operativo en el proceso
- La cuarta columna: UUID que identifica de forma única la imagen binaria, correspondiente al archivo dSYM
- Columna 4: Ruta al archivo binario en el disco. (MacOS utiliza marcadores de posición para reemplazar los componentes de ruta reconocibles por el usuario para proteger la privacidad)
Referencia:
examinar los campos en un informe de fallos