Como ler o log de falhas? Como descobrir por que o aplicativo trava na biblioteca do sistema? O que significa exc_crash (Sigabrt)?

StackOverflow https://stackoverflow.com/questions/2322198

Pergunta

Recebi uma colisão de um cliente para descobrir por que meu aplicativo falha no iPhone dela.

Aqui algumas informações do Crash Log:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Rastreamento da pilha para o tópico 0

Thread 0 Crashed:
0   libSystem.B.dylib              0x3293f98c 0x328c1000 + 518540
1   libSystem.B.dylib              0x3293f97c 0x328c1000 + 518524
2   libSystem.B.dylib              0x3293f96e 0x328c1000 + 518510
3   libSystem.B.dylib              0x3295461a 0x328c1000 + 603674
4   libstdc++.6.dylib              0x30a143b0 0x309cf000 + 283568
5   libobjc.A.dylib                0x3347a858 0x33475000 + 22616
6   libstdc++.6.dylib              0x30a12776 0x309cf000 + 276342
7   libstdc++.6.dylib              0x30a127ca 0x309cf000 + 276426
8   libstdc++.6.dylib              0x30a12896 0x309cf000 + 276630
9   libobjc.A.dylib                0x33479714 0x33475000 + 18196
10  CoreFoundation                 0x335c8210 0x33534000 + 606736
11  CoreFoundation                 0x3354ea8e 0x33534000 + 109198
12  CoreFoundation                 0x33545ab8 0x33534000 + 72376
13  Journaler Lite                 0x0001699e -[AccountManager unsignedIntegerValueForPath:] (AccountManager.m:151)
...

Aqui está o código de AccountManager.m:

 NSNumber *number = ...;
 if (number) {
  return [number unsignedIntegerValue]; // line 151
 } else {
  return 0;
 }

A questão principal é como ler esse log de falhas? O aplicativo trava em algum lugar dentro da biblioteca do sistema, não há mais informações adicionais. Existe alguma maneira de encontrar motivos de colisão?

atualizar:Eu pesquisei muitas postagens no fóruns, onde o tipo de exceção é EXC_CRASH (SIGABRT) E as primeiras linhas de uma pilha de threads acidentadas é:

Thread 0 Crashed:
0   libSystem.B.dylib              0x3293f98c 0x328c1000 + 518540
1   libSystem.B.dylib              0x3293f97c 0x328c1000 + 518524
2   libSystem.B.dylib              0x3293f96e 0x328c1000 + 518510
3   libSystem.B.dylib              0x3295461a 0x328c1000 + 603674
4   libstdc++.6.dylib              0x30a143b0 0x309cf000 + 283568
5   libobjc.A.dylib                0x3347a858 0x33475000 + 22616
6   libstdc++.6.dylib              0x30a12776 0x309cf000 + 276342
7   libstdc++.6.dylib              0x30a127ca 0x309cf000 + 276426
8   libstdc++.6.dylib              0x30a12896 0x309cf000 + 276630
9   libobjc.A.dylib                0x33479714 0x33475000 + 18196
10  CoreFoundation                 0x335c8210 0x33534000 + 606736
11  CoreFoundation                 0x3354ea8e 0x33534000 + 109198

O que esse tipo de exceção (EXC_CRASH (SIGABRT)) significa?

Foi útil?

Solução

Primeiro, você precisa simbolizar o log de falhas usando o DSYM para entender o que está acontecendo. Você precisará ter o arquivo DSYM a partir do momento em que o aplicativo foi construído. O arquivo DSYM permite reverter o mapa desses endereços de memória de volta às linhas legíveis de código.

Sigabrt é o sinal que você recebe quando tem uma exceção não atendida, como ligar [someArray objectAtIndex:2] Se a matriz tivesse apenas 1 item. Ou, mais frequentemente, um seletor não reconhecido: [NSArray unsignedIntValue].

Dê uma olhada neste acidente de login essa questão. Observe que as bibliotecas de pilha de chamadas na fundação são as mesmas do seu código - e é um seletor não reconhecido.

Seu código é:

NSNumber *num = foo;
if (num)
{
  bar = [num unsignedIntValue];
}

O que você não nos disse - mas é muito importante - é o que está em "Foo". Como você atribui esse NSNumber? Se for outro objeto que não seja um NSNumber, seu registro de falhas se parecerá com o seu.

Se você queria estar realmente defensivo em sua programação, pode dizer:

if (num && [num isKindOfClass:[NSNumber class]])

Mas, na verdade, o que quer que o seu "foo" esteja sempre retornando um número nsnum.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top