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

Introdução Detalhada ao Rastreamento Convencional de Crash do iOS e Aplicação do Bugly

Métodos comuns de rastreamento de falhas do iOS e integração do Bugly

Quando o aplicativo cair, durante a fase de desenvolvimento, geralmente é possível rastrear as informações de falha das seguintes maneiras

#1.Executar no simulador e verificar o log de erro do Xcode

#2Depuração no dispositivo real, verifique o log de erro do Xcode

#3.Executar no dispositivo e verificar o log do sistema do dispositivo

 A seguir, apresentamos um exemplo de código que causará falha: crashdemo:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Realizar quaisquer configurações adicionais após a carga da vista, geralmente a partir de um nib.
  [self performSelector:@selector(print) withObject:nil afterDelay:5];
}
- (void)print {
  NSArray *array = @[];
  NSLog(@"%@", array[1]);
}

Demo#1.Executar no simulador e verificar o log de erro do Xcode

A aplicação cairá imediatamente após a execução, você pode ver as seguintes informações de erro no log do sistema do Xcode

2016-10-29 12:13:29.015 CrashDemo[37842:7436441] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
*** First throw call stack:
(
  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 com exceção não capturada do tipo NSException
(lldb) 

Pelo log do Xcode, podemos ver que ocorreu uma excessão de acesso ao array, o modo de excessão de acesso ao array é chamado print

Para este demo, claro, estamos cientes de que é o array[1]ocorreu uma excessão de limite, mas como verificar onde ocorreu a excessão de limite em um programa completo?63;

Neste momento, podemos usar a função Show the breakpoint navigator do Xcode, clicar no sinal mais para adicionar breakpoint de exceção

Neste momento, enquanto executamos o programa, o Xcode parará automaticamente na seção de código onde ocorrerá o crash

Demo#2Depuração no dispositivo real, verifique o log de erro do Xcode
Se houver adição de ponto de exceção, o programa parará automaticamente na impressão de array[1]naquela linha. Se não houver adição, o programa cairá, o Xcode exibirá o seguinte log de erro

2016-10-29 12:15:53.561 CrashDemo[1062:316582] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
*** First throw call stack:
(0x211b398b 0x2094ee17 0x211433e7 0xc5a3b 0x219d1ad5 0x211765ff 0x21176231 0x2117407d 0x210c32e9 0x210c30d5 0x226b3ac9 0x257880b9 0xc5c99 0x20d6b873)
libc++abi.dylib: terminando com exceção não capturada do tipo NSException
(lldb) 

Através das informações de erro, podemos ver que ocorreu uma excessão de acesso ao array, se houver adição de breakpoint de exceção, ele parará automaticamente na linha de código onde ocorreu o erro.

 Demo#3Executar no dispositivo real, verifique o log do sistema do dispositivo

O Xcode para de executar o crashdemo, selecione a janela do Xcode - devices, selecione o telefone - view device logs

Então, execute o crashdemo no telefone, ordene os logs do dispositivo pelo tempo para ver o log de crash mais recente do crashdemo

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 

Esses podem ser implementados facilmente no estágio de desenvolvimento, mas o que acontece quando o app é lançado e o usuário tem um crash?63; os usuários comuns só podem feedback quando o crash ocorre

Em seguida, tentamos verificar se podemos encontrar, mas isso não é eficiente e geralmente é difícil replicar o crash do usuário

Bugly resolveu esse problema

Quando o programa cair, o Bugly SDK enviará automaticamente as informações de erro para o servidor, facilitando a visualização e análise dos desenvolvedores.

Então, como usar Bugly?

Primeiro, vá para https://bugly.qq.com/v2/registrar conta, e registrar app para baixar SDK pacote

arraste Bugly.framework para o projeto, lembre-se de marcar copy if needed.

em seguida, adicione libz.tbd / libstdc++.tbd / Security.framework / adicionar SystemConfiguration.framework ao projeto

register em delegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [Bugly startWithAppId:@"Aqui você deve substituir pelo seu AppId"]; 
    return YES; 
 }

Dessa forma, quando o programa cair, as informações de falha serão enviadas automaticamente para o servidor, você pode verificar no seubugly conta.

 

 Obrigado por ler, espero que ajude, obrigado pelo apoio deste site!

Você Também Gostaria