Objetivo C – obter o número da linha ou o rastreamento completo da pilha do erro do depurador?

É possível obter um número de linha para o código-fonte (ou qualquer coisa que ajude a depurar onde está o problema) do depurador, que mostra onde o problema é originário?

Estou recebendo um erro:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9) 

o que obviamente significa que estou saindo dos limites em algum momento, no entanto, se possível, gostaria de obter mais informações para me ajudar a resolver o problema.

Eu estou colocando um ponto de interrupção e tentando percorrer o programa linha por linha, mas é um processo tedioso. Obrigado!

Quando o depurador parar, vá até o “Navegador de Depuração” e certifique-se de que o controle deslizante na parte inferior esteja todo para a direita.

Analise seu olho para baixo a partir do ponto em que a exceção é lançada e você deve eventualmente chegar ao seu próprio código. Clique no nome do método / function apropriado e o código será aberto no editor.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Se você não vir nenhum dos seus próprios methods no rastreamento de pilha, a exceção pode ter sido passada por uma chamada no estilo performSelector nesse caso, o rastreamento de pilha desapareceu. Se este for o caso, você pode obter informações melhores adicionando um ponto de quebra de exceção “On Throw”. Primeiro mude para o “Navegador Breakpoint”:

insira a descrição da imagem aqui

Em seguida, clique no sinal de mais e escolha “Adicionar ponto de interrupção de exceção …”

insira a descrição da imagem aqui

Crie um ponto de interrupção “On Throw”:

insira a descrição da imagem aqui

Isso interromperá o depurador no ponto exato em que a exceção é lançada e você obterá um rastreamento de pilha melhor. É uma boa idéia ter um ponto de interrupção de exceção como este ativado o tempo todo, embora você ocasionalmente receba exceções internas do código da Apple (por exemplo, ao usar o QLPreviewController, MPMoviePlayerController).

Você também deve considerar o uso do NSSetUncaughtExceptionHandler. (Você pode salvar o log de travamento no disco, verificar a próxima boot se um novo log de travamento for salvo, anexá-lo a um email etc.)

Coloque isso no seu método didFinishLaunchingWithOptions:

 NSSetUncaughtExceptionHandler(&exceptionHandler); 

e implementar seu manipulador de exceções:

 void exceptionHandler(NSException *exception) { NSLog(@"%@",[exception name]); NSLog(@"%@",[exception reason]); NSLog(@"%@",[exception userInfo]); NSLog(@"%@",[exception callStackSymbols]); NSLog(@"%@",[exception callStackReturnAddresses]); }