Como Resolver SIGABRT Erro no Xcode
Escrito por Reinder de Vries, no dia 6 de agosto de 2020 em Desenvolvimento de aplicativos, o iOS
de Um minuto de seu iOS app funciona muito bem no Xcode, e que o próximo tem, desesperadamente, caiu com um enigmático SIGABRT erro. O que se passa??
neste tutorial você aprenderá:
- Como resolver o “Sinal SIGABRT” erro no Xcode
- Como usar algumas das ferramentas de depuração no Xcode
- o Que SIGABRT significa, e quais as suas causas são
- 3 abordagens para encontrar a causa raiz de SIGABRT
Pronto? Vamos.o que significa” Thread 1: Signal SIGABRT”?o que significa” Thread 1: Signal SIGABRT”?
o erro SIGABRT significa “abortamento do sinal”. É um sinal que é enviado pelo iOS – o sistema operacional – para um aplicativo em execução, que irá imediatamente sair do aplicativo por causa de um erro de tempo de execução. Isso significa, essencialmente, o aplicativo travou…
Aqui está o que parece no Xcode:
Na imagem, você vê algumas coisas:
- à esquerda, você verá uma lista de linhas que correu quando o aplicativo travou. Você vê que o fio que causou o estoiro é o fio principal, ou”Thread 1″.
- no editor vemos que o temido tópico 1: erro de sinal SIGABRT. Ele destacou a linha 12 no editor, A definição de classe de
AppDelegate
. - na parte inferior você vê o resultado útil de depuração. Neste caso, você recebe um stacktrace e uma mensagem de erro críptico sobre não ser ” Código de valor-chave compatível.”
o problema com o erro SIGABRT é que ele é muito genérico. Xcode está basicamente dizendo: “Olhe, seu aplicativo caiu, é tudo o que sabemos.”Na maioria dos casos do erro SIGABRT, você obtém pouca informação sobre o que causou o erro.
Before we go on, let’s discuss a few misconceptions and common pitfalls of SIGABRT:
- The SIGABRT error usually has nothing to do with the
AppDelegate
class declaration, even though it highlights that line in Xcode. A linha é destacada porque é a primeira linha de código do seu aplicativo. Não perca o seu tempo procurando na classeAppDelegate
, a menos que tenha certeza absoluta de que o bug está lá. - o stacktrace é uma lista de chamadas de funções que levam ao estoiro da aplicação. Isso não significa que a linha de código que causou o erro esteja em qualquer lugar no stacktrace. Às vezes é, mas em outros casos, o stacktrace apenas leva ao código que sufocou em um valor que você colocou em outro lugar em seu próprio código.não fiques cego por um erro SIGABRT. Há uma causa racional e lógica para o erro. Deve ser um erro no seu próprio código, e não há nada de errado nisso. As aplicações não são mágicas, ninguém te quer apanhar, e os insectos nunca aparecem do nada. Não se deixe frustrar com pensamentos como ” correu bem ontem!- é sempre assim, E agora não é!
Agora que estabelecemos uma linha de base, vamos chegar à primeira causa de SIGABRT.
Saiba como criar apps para iOS
Começar com o iOS 14 e Swift 5
Entrar para o meu curso de desenvolvimento iOS, e aprender a construir o grande iOS 14 apps com Swift 5 e Xcode 12.
verifique as suas saídas
uma causa comum de “Signal SIGABRT” é um erro ou erro nas suas saídas. Eis o que aconteceu.:
- Você criou um novo controlador de visualização em Interface Builder, e configure-o com alguns elementos da INTERFACE do usuário, como botões e etiquetas
- Você conectado estes elementos de INTERFACE do usuário para seu código usando tomada de propriedades, o que cria uma conexão entre uma propriedade da sua view controller e o elemento de INTERFACE do usuário na Interface Builder
- Em um ponto que você mudou o nome do estabelecimento inicial de propriedade e sua aplicação começou a bater com uma SIGABRT erro
Quando você estiver usando a Interface Builder para criar um controlador de visualização, o aplicativo vai usar o arquivo XIB para gerar o controlador de visualização da INTERFACE do usuário quando o seu aplicativo é executado (falando grosso modo). Neste ponto, ele também conectará saídas do XIB às propriedades da classe view controller.
Se você mudou o nome de uma propriedade outlet, sua aplicação não pode mais encontrá-lo. E por isso abrirá uma excepção. O que está causando o erro SIGABRT, não é lidar com essa exceção.
aqui está o que se parece no Xcode:
See what’s happening? The property is called , but the outlet is still called button. Em um ponto nós mudamos o outlet-porque o novo nome é melhor-e confundimos o app, que o fez cair.
no topo do stacktrace também detectamos outra pista:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: ': this class is not key value coding-compliant for the key button.
o que significa isso? O aplicativo está nos dizendo neste ponto que o controlador de visualização não é compatível com codificação de valores chave para a chave button
. Isto significa que não pode encontrar a propriedade button
no controlador de visualização. E isso é verdade, porque nós o renomeamos.
iOS usa um mecanismo chamado codificação de valores chave para inspecionar as propriedades que um controlador de visualização tem, para que ele possa usar essas propriedades para referenciar elementos UI que ele criou com base no XIIB.
Como você resolve o bug neste ponto? Você poderá usar 2 abordagens:
- você renomeia a propriedade de volta para o seu nome original
- você remove a ligação de saída no Construtor de interfaces, e reconecta-a com o novo nome da propriedade de saída
vamos continuar!
dica rápida: assim como uma mudança @IBOutlet
pode causar ” Thread 1: signal SIGABRT”, assim pode erroneamente mudar o nome de uma ação, ou seja, com @IBAction
, causa o erro SIGABRT.
verifique o Stacktrace
em muitos casos, o Xcode não lhe mostrará quaisquer mensagens de erro úteis para um estoiro SIGABRT. Quando isso acontece, é útil conhecer alguns comandos de depuração, tais como bt
.
Xcode has an integrated debugging environment called LLDB. É o que você vê no fundo do Xcode quando seu aplicativo é executado, a área de saída da Consola ou depuração. Você vê muitas vezes mensagens de depuração aqui, mas sabia que também o pode usar para introduzir comandos?
da próxima vez que o seu aplicativo estoirar, tente digitar help
no LLDB. Assim:
verá que muitos dos comandos do LLDB correspondem directamente às acções que pode tomar com o depurador, como a definição de pontos de paragem, a passagem sobre linhas de código e a inspecção dos valores de execução.
um comando é particularmente útil. Você pode digitar em bt
para ver a pilha de chamadas atual (também chamado de “backtrace” ou “stacktrace”). Esta é uma lista de todas as funções que correram até ao estoiro actual. Este traço tipicamente inclui a função que causou um bug.
aqui, confira o stacktrace de um índice típico fora do intervalo de erro. Na imagem abaixo, nós deliberadamente causamos esse erro ao obter o index 99
de um array que só tem 4 itens. Quando o aplicativo cai, bt
pode nos dizer qual linha de código causou o erro.
Pode detectar a seguinte informação no stacktrace?
- O código incorreto é na linha 21 de
ViewController.swift
dentro deviewDidLoad()
função - Você pode até mesmo ver que foi utilizado o índice “getter” de
Array
- Antes de a falha de um monte de vista do controlador relacionadas com as chamadas de função foram feitas
com Base nas informações que nós temos com bt
podemos encontrar a linha incorreta no código e corrigir. Xcode já nos ajudou neste caso, destacando o erro no editor. Em alguns cenários você não terá essa sorte, e então pode ser útil usar o comando bt
.
Uma última coisa: você pode inspecionar os valores em tempo de execução com o comando print
. No cenário acima, digitar print names
teria produzido esta saída:
() $R0 = 4 values { = "Ford" = "Arthur" = "Zaphod" = "Trillian"}
para imprimir objetos complexos, usar . Da hora!
tenha em mente que um stacktrace corre para fora. A parte inferior do traço da pilha mostra chamadas de alto nível de funções, e quanto mais alto o stack você vai, mais profundas as chamadas vão para dentro. A última, mais recente, chamada de nível mais profundo está no topo da pilha.
faça um ponto de paragem de excepção
pode usar pontos de paragem para parar a execução do seu código numa determinada linha. Nesse ponto você pode então inspecionar valores e passar por funções.
é despoletado um ponto de paragem de excepção sempre que ocorre uma excepção no seu código. Em vez de indicar em que Linha é despoletado o ponto de paragem, você indica ao depurador para interromper a execução do código para excepções.
os pontos de paragem das excepções são úteis para inspeccionar o código quando ocorre uma excepção. Você pode ver que Linha de código lançou a exceção, e você pode inspecionar valores em seu código nesse ponto. Algumas exceções são causadas por bugs ou estados inválidos do seu aplicativo, então os pontos de paragem de exceção são úteis para encontrar e corrigir esses bugs.
Aqui está como você pode definir um ponto de paragem para exceções:
- Vá para o ponto de Interrupção navigator no Xcode, usando as guias à esquerda
- Clique no canto inferior esquerdo
+
botão e escolher Exceção de ponto de Interrupção - Deixar as configurações padrão como está (apesar de que eles são úteis para personalizar)
- Executar seu código
Quando uma exceção é lançada, a execução de seu aplicativo pára. Você pode agora usar o depurador para inspecionar os valores, passar pelo código e usar os comandos LLDB. Quando possível, Xcode irá levá-lo para a linha de código que causou a exceção.
tenha em mente que uma excepção não interrompe necessariamente a sua aplicação! Assim, sempre que o ponto de paragem da excepção estiver activo, e ocorrer uma excepção, o seu aplicativo é interrompido. Parar o código com um ponto de paragem não é o mesmo que um estoiro de aplicação, por isso não deixes que isso te confunda.
Por exemplo, um ponto de paragem de excepção será despoletado por uma excepção de restrições insatisfeitas, mas isso não irá estoirar com a sua aplicação. Use o ponto de paragem da excepção para recolher informações extra para o estoiro do SIGABRT, e depois desactive-o logo que tenha resolvido o erro (até que seja necessário de novo).
Saiba como criar apps para iOS
Começar com o iOS 14 e Swift 5
Entrar para o meu curso de desenvolvimento iOS, e aprender a construir o grande iOS 14 apps com Swift 5 e Xcode 12.
Leitura Adicional
o erro de SIGABRT é bastante críptico, e pode ser difícil de resolver. Porque é que o Xcode não dá mensagens de erro úteis? Bem, essa é uma boa pergunta…
A resposta curta é que há tantas partes em movimento no desenvolvimento do iOS que o Xcode nem sempre pode determinar a causa de um acidente. O Xcode não sabe que você erroneamente mudou o nome de uma tomada. Ele só sabe que ao ligar a tomada, algum código foi invocado, e isso causou uma exceção.
isto significa que você sempre verá um erro que é o mais próximo possível da causa raiz. O melhor que pode fazer é cometer muitos erros, descodificar muitas mensagens de erro e conhecê-las melhor. E o que você aprendeu neste tutorial, é como encontrar e resolver o erro SIGABRT!queres saber mais? Verifique estes recursos:
- Começar com a Depuração no Xcode
- Compreender O “não reconhecido Seletor Enviado para a Instância de Erro” No Xcode
- Compreender As “Inesperadamente, nil, enquanto a revelação de um valor Opcional de Erro”
- Compreender O “Uso não Resolvidos Identificador de Erro” No Xcode
- Fora Por Um os Erros Em Rápida de Programação
- Tratamento de erros Em Swift Com Fazer-Try-Catch