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