EXC_I386_GPFLT certamente se refere a "Falha de proteção geral", que é a maneira do x86 dizer que "você fez algo que não tem permissão para fazer". Normalmente NÃO significa que você acessou fora dos limites de memória, mas pode ser que seu código esteja saindo dos limites e fazendo com que códigos / dados inválidos sejam usados de uma maneira que crie uma violação de proteção de algum tipo.
Infelizmente, pode ser difícil descobrir exatamente qual é o problema sem mais contexto. Existem 27 causas diferentes listadas no meu Manual do Programador AMD64, Vol 2 de 2005 - por todas as contas, é provável que 8 anos depois teria adicionado alguns Mais.
Se for um sistema de 64 bits, um cenário plausível é que seu código esteja usando um "ponteiro não canônico" - o que significa que um endereço de 64 bits é formado de forma que os 16 bits superiores do endereço não sejam todas as cópias do topo dos 48 bits inferiores (em outras palavras, os 16 bits principais de um endereço devem ser todos 0 ou 1, com base no bit logo abaixo de 16 bits). Essa regra existe para garantir que a arquitetura possa "expandir com segurança o número de bits válidos no intervalo de endereços". Isso indicaria que o código está sobrescrevendo alguns dados de ponteiro por outras coisas ou saindo dos limites ao ler algum valor de ponteiro.
Outra causa provável é o acesso desalinhado com um registro SSE - em outras palavras, a leitura de um registro SSE de 16 bytes de um endereço que não está alinhado com 16 bytes.
Existem, como eu disse, muitos outros motivos possíveis, mas a maioria deles envolve coisas que o código "normal" não faria em um sistema operacional de 32 ou 64 bits (como carregar registradores de segmento com índice de seletor inválido ou gravar em MSR (registros específicos do modelo)).
Freqüentemente, você pode obter informações dos arquivos de cabeçalho. Por exemplo:
OK, então é uma falha de proteção geral (como o próprio nome sugere). Pesquisar "falha de proteção geral i386" no Google produz muitos acertos, mas este parece interessante:
Isso
13
corresponde ao que vimos nos arquivos de cabeçalho, por isso parece a mesma coisa. No entanto, do ponto de vista do programador do aplicativo, significa apenas que estamos fazendo referência a uma memória que não deveríamos estar, e realmente não importa como ela é implementada no hardware.fonte
Eu me perguntei por que isso apareceu durante meus testes de unidade.
Eu adicionei uma declaração de método a um protocolo que incluía
throws
; mas o método de arremesso potencial nem mesmo foi usado naquele teste específico. Habilitar Zumbis no teste parecia muito problemático.Acontece que um ⌘K limpo funcionou. Sempre fico pasmo quando isso resolve problemas reais.
fonte
Tive uma exceção semelhante no Swift 4.2. Passei cerca de meia hora tentando encontrar um bug no meu código, mas o problema foi resolvido depois de fechar o Xcode e remover a pasta de dados derivados. Aqui está o atalho:
fonte
No meu caso, o erro foi lançado no Xcode ao executar um aplicativo no simulador iOS. Embora não possa responder à pergunta específica "o que significa o erro", posso dizer o que me ajudou, talvez também ajude os outros.
A solução para mim foi
Erase All Content and Settings
no simulador eClean Build Folder...
no Xcode.fonte
Tive esse problema ao sair de uma visualização (voltar para a visualização anterior).
a razão foi ter
Mude
safeAreaLayoutGuide
paraself
resolver o problema.O significado alinha a visualização com a visão frontal, posterior, superior, inferior, em vez da área segura)
fonte
Isso aconteceu comigo porque o Xcode não pareceu gostar de mim usando o mesmo nome de variável em duas classes diferentes (que estão em conformidade com o mesmo protocolo, se isso importa, embora o nome da variável não tenha nada relacionado em nenhum protocolo). Simplesmente renomeei minha nova variável.
Eu tive que entrar nos setters onde ele estava travando para poder vê-lo durante a depuração. Esta resposta se aplica ao iOS
fonte
Se o erro for lançado dentro de um fechamento que define
self
comounowned
, você pode estar limitado no que pode acessar e obterá esse código de erro em determinadas situações. Especialmente durante a depuração. Se este for o seu caso, tente mudar[unowned self]
para[weak self]
fonte
Recebi este erro ao fazer isso:
Ele foi embora quando eu voltei para:
fonte
Para mim, é um problema relacionado ao storyboard, há a opção de construção do ViewController para o conjunto iOS 9.0 e posterior, previamente definido para o iOS 10.0 e posterior. Na verdade, eu quero fazer o downgrade da versão 10 para iOS 9.3.
fonte