Sempre que meu aplicativo trava, o Xcode destaca a chamada UIApicationMain () na função main () como a linha que causou o travamento. Em alguns casos, isso costumava ser normal (falha de segmentação, por exemplo), mas a falha com a qual estou tentando lidar é um SIGABRT simples, com informações detalhadas registradas no console:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
O Xcode costumava mostrar a linha corretamente com SDKs mais antigos, mas desde que atualizei para o Xocde 4.2 que mudou. É bastante óbvio que o Xcode sabe exatamente o que causou a falha (ou poderia saber), mas ainda não está mostrando a linha real. Existe alguma correção ou solução alternativa para isso?
objective-c
ios
xcode
cocoa-touch
nsexception
JonasG
fonte
fonte
Respostas:
Você também deve garantir que você tenha pontos de interrupção definidos para todas as exceções. Isso fará com que o Xcode pare na linha em que a exceção está ocorrendo. Faça o seguinte [no Xcode 4]:
No Navegador de projeto, no lado esquerdo do Xcode, clique no navegador do ponto de interrupção (quase todo o lado direito da barra de botões superior. O ícone se parece com uma grande seta à direita).
Na parte inferior do navegador, clique no botão "+".
Clique em "Adicionar ponto de interrupção de exceção".
Um novo ponto de interrupção será criado. Ele deve ser configurado conforme necessário, mas você pode ajustar seu comportamento.
Execute seu projeto e reproduza a exceção.
Você também mencionou que vinculou a algumas bibliotecas / estruturas de terceiros. Se a exceção estiver ocorrendo nessas estruturas, você terá dificuldades, pois o código é compilado e o Xcode não pode realmente mostrar a linha que causou a exceção. Se esse for o caso e você tiver certeza de que está usando as bibliotecas corretamente, envie um relatório de erro aos mantenedores dessas bibliotecas.
fonte
Basta seguir as instruções nesta resposta do StackOverflow:
Ativar zumbis
Basicamente, você só precisa "Ativar Zumbis". O Xcode deve quebrar na linha que causou o problema.
(É absolutamente chocante que, mesmo em 2017, o Xcode ainda esteja desativado por padrão. Por que você não deseja ver a linha que causou o problema? E " Ativar objetos zumbis "?! Realmente?! Os autores do Xcode realmente Acreditamos que esse é um nome útil, o que faria algum sentido para os novos desenvolvedores? Está deprimindo a classificação ruim do Xcode, ano após ano, na App Store. Ninguém está ouvindo ...)
fonte
Editar o esquema atual e permitir
NSZombieEnabled
,MallocStackLogging
eguard malloc
. Em seguida, quando seu aplicativo falhar, digite isso no console gdb:Substitua
0x543216
pelo endereço do objeto que causou oNSInvalidArgumentException
e deve fornecer um rastreamento de pilha muito mais útil, mostrando as linhas do seu código que estão causando a falha.fonte
Eu já vi esse comportamento em código altamente otimizado; verificar, ajustar o nível de otimização do seu alvo e o das bibliotecas de terceiros pode ajudar. (Configuração do nível de otimização do LLVM 3.0)
Você está gerando símbolos de depuração?
fonte
Eu escrevi o código para gerar uma falha do índice fora do limite. A seguir, é apresentada a exceção.
Se você ler atentamente o
First Throw call stack
0 and 1
são os processos do sistema após a falha.2
é a linha que causou a exceção.3
informa o nome da classe (ViewController
) e a função naem (ComplexFunction
) na qual a exceção foi lançada.fonte