English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introducción detallada de métodos de seguimiento habituales de Crash de iOS y la aplicación de integración de Bugly

Métodos comunes de seguimiento de errores de iOS Crash y la integración de Bugly

Cuando el app se descompone, durante la fase de desarrollo, generalmente se pueden rastrear las información de error de la siguiente manera

#1.Ejecutar el simulador, ver el registro de errores de xcode

#2. Debugging en dispositivo real, ver el registro de errores de xcode

#3.Ejecutar en dispositivo real, ver el registro de sistema del dispositivo

 A continuación, se ilustra con un ejemplo de código que causará un error de tiempo de ejecución: crashdemo:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Haga cualquier configuración adicional después de cargar la vista, generalmente desde un nib.
  5]
}
- (void)print {
  NSArray *array = @[];
  1]
}

Demo#1.Ejecutar el simulador, ver el registro de errores de xcode

El programa se descompondrá inmediatamente después de la ejecución, puede ver los siguientes mensajes de error en el registro de sistema de xcode

2016-10-29 12:13:29.015 CrashDemo[37842:7436441] *** El aplicación se está terminando debido a una excepción no capturada 'NSRangeException', razón: '"*** -[__NSArray0 objectAtIndex:]: índice 1 fuera de los límites para un NSArray vacío
*** Primera llamada a la pila de excepciones:
(
  0  CoreFoundation           0x00b7ba84 __exceptionPreprocess + 180
  1  libobjc.A.dylib           0x00642e02 objc_exception_throw + 50
  2  CoreFoundation           0x00b22390 __CFArrayGetTypeID_block_invoke + 0
  3  CoreFoundation           0x00ac07f8 -[NSArray objectAtIndexedSubscript:] + 40
  4  CrashDemo              0x000877b7 -[ViewController print] + 87
  5  Foundation             0x00250d71 __NSFireDelayedPerform + 442
  6  CoreFoundation           0x00acd576 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
  7  CoreFoundation           0x00accf72 __CFRunLoopDoTimer + 1250
  8  CoreFoundation           0x00a8b25a __CFRunLoopRun + 2202
  9  CoreFoundation           0x00a8a706 CFRunLoopRunSpecific + 470
  10 CoreFoundation           0x00a8a51b CFRunLoopRunInMode + 123
  11 GraphicsServices          0x041e4664 GSEventRunModal + 192
  12 GraphicsServices          0x041e44a1 GSEventRun + 104
  13 UIKit                0x00f0c1eb UIApplicationMain + 160
  14 CrashDemo              0x00087bba main + 138
  15 libdyld.dylib            0x03189a21 start + 1
)
libc++abi.dylib: terminando con una excepción no capturada de tipo NSException
(lldb) 

A través del registro de xcode podemos ver que se ha producido un desbordamiento de acceso a array, el método de desbordamiento se llama print

Para este demo, por supuesto, estamos muy claros sobre el array[1] ocurre un desbordamiento, pero ¿cómo verificar en un programa completo dónde ocurre el desbordamiento?&63;

En este momento, podemos utilizar la función Show the breakpoint navigator de xcode, hacer clic en el signo más para seleccionar add exception breakpoint

En este momento, mientras ejecutamos el programa, xcode se detendrá automáticamente en el segmento de código donde ocurrirá el crash

Demo#2. Debugging en dispositivo real, ver el registro de errores de xcode
Si se ha agregado un punto de interrupción de excepción, el programa se detendrá automáticamente en la impresión de array[1] en esa línea. Si no se ha agregado, el programa se bloqueará, xcode mostrará el siguiente registro de errores

2016-10-29 12:15:53.561 CrashDemo[1062:316582] *** El aplicación se está terminando debido a una excepción no capturada 'NSRangeException', razón: '"*** -[__NSArray0 objectAtIndex:]: índice 1 fuera de los límites para un NSArray vacío
*** Primera llamada a la pila de excepciones:
(0x211b398b 0x2094ee17 0x211433e7 0xc5a3b 0x219d1ad5 0x211765ff 0x21176231 0x2117407d 0x210c32e9 0x210c30d5 0x226b3ac9 0x257880b9 0xc5c99 0x20d6b873)
libc++abi.dylib: terminando con una excepción no capturada de tipo NSException
(lldb) 

A través de los mensajes de error solo podemos ver que se ha producido una excepción de desbordamiento de array, si se ha agregado un punto de interrupción de excepción, se detendrá automáticamente en la línea de código donde ocurre el error.

 Demo#3. Ejecutar en dispositivo real, ver el registro del sistema del dispositivo

xcode detiene la ejecución de este crashdemo, selecciona la ventana de xcode - dispositivos, selecciona el teléfono - ver logs de dispositivo

Luego, ejecuta crashdemo en el teléfono, ordena los logs de dispositivo por fecha en los logs de dispositivo para ver el log de crash de crashdemo más reciente

Incident Identifier: 9A4C52F0-B0D7-42C9-A7CB-D4D3321D00D5
CrashReporter Key:  90f4d3621773443794fa73f506fd6bdef49fc269
Hardware Model:   iPhone4,1
Process:       CrashDemo [1074]
Path:        /private/var/containers/Bundle/Application/1307034E-9C2B-451F-ACD9-04C97DEC047B/CrashDemo.app/CrashDemo
Identifier:     PEGA.CrashDemo
Version:       1 (1.0)
Code Type:      ARM (Native)
Parent Process:   launchd [1]
Date/Time:      2016-10-29 12:21:49.49 +0800
Launch Time:     2016-10-29 12:21:43.43 +0800
OS Version:     iOS 9.3.1 (13E238)
Report Version:   104
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
Filtered syslog:
None found
Last Exception Backtrace:
0  CoreFoundation          0x211b3986 __exceptionPreprocess + 122
1  libobjc.A.dylib          0x2094ee12 objc_exception_throw + 34
2  CoreFoundation          0x211433e2 -[__NSArray0 objectAtIndex:] + 110
3  CrashDemo             0x000e6a36 0xe0000 + 27190
4  Foundation            0x219d1ad0 __NSFireDelayedPerform + 464
5  CoreFoundation          0x211765fa 

Estos se pueden implementar muy fácilmente en la fase de desarrollo, pero ¿qué pasa cuando el usuario tiene un crash después de que el app se lanzó?63; Los usuarios suelen solo poder informar cuándo ocurre el crash

Luego intentamos hacer un intento para ver si podemos encontrarlo, pero esto no es eficiente y generalmente es difícil reproducir el crash del usuario

Bugly resuelve este problema

El SDK de Bugly enviará automáticamente la información de error al servidor cuando el programa se bloquee, lo que facilita que los desarrolladores la vean y analicen

Entonces, ¿cómo usar Bugly?

Primero, ve a https://bugly.qq.com/v2/registrar una cuenta y registrar la app para descargar el paquete de SDK

arrastrar Bugly.framework al proyecto, recuerda marcar copy if needed.

luego agregar libz.tbd / libstdc++.tbd / Security.framework / agregar SystemConfiguration.framework al proyecto

registrar en delegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [Bugly startWithAppId:@"Aquí reemplaza con tu AppId"]; 
    return YES; 
 }

De esta manera, cuando el programa se bloquea, la información de bloqueo se enviará automáticamente al servidor y puedes verla ingresando a tu cuenta de bugly

 

 Gracias por leer, espero que pueda ayudar a todos, gracias por el apoyo a nuestro sitio!

Te gustará