Desejo testar os relatórios de falhas do meu aplicativo em campo deliberadamente, quando o usuário executa uma ação específica que é improvável que um usuário real execute acidentalmente.
Mas qual é uma boa maneira confiável de travar o aplicativo que não cria um aviso no momento da compilação?
Edit: Observe que muitas respostas aparentemente óbvias para essa pergunta resultam em exceções que são capturadas pelo cacau e, portanto, não resultam no travamento do aplicativo.
iphone
objective-c
ios
Nestor
fonte
fonte
WebKit discarded an uncaught exception
todas essas idéias até agora! Quem sabia que era tão difícil fazer um aplicativo travar hoje em dia?(void)0/0;
,(void)*(char*)0;
Respostas:
no Objective-C, use C diretamente para causar um mau acesso
Nota: enquanto isso funciona em qualquer sistema que eu conheço - em uma versão futura do tempo de execução C OU no compilador, isso pode não levar mais a uma falha. consulte O comportamento nulo da dereferência de ponteiro nulo é definido em Objective-C? )
(rapidamente, você teria que fazer uma ponte para objC para fazer isso)
fonte
WebKit discarded an uncaught exception
problema.Meu favorito atual:
Um clássico:
E alguns pr0n:
Todos eles geram falhas capturadas pela minha ferramenta de relatório de falhas.
fonte
assert()
é um recurso de depuração, faz pouco sentido deixar esse fragmento nas versões de lançamento. Existem testes de unidade para isso.assert
não é um recurso de depuração. Uma afirmação falhada é um erro que você julgou impossível. É melhor abortar, mesmo uma versão, do que continuar executando um programa com consequências imprevisíveis.Como todos usamos o Clang para iOS, isso é bastante confiável:
Isso tem o benefício de ter sido projetado exatamente para esse fim, portanto não deve gerar avisos ou erros do compilador.
fonte
abort();
causa rescisão anormal ... Isso é um acidente.fonte
Que tal um bom e velho estouro de pilha :)
fonte
Um dos mais populares - falha seletora não reconhecida:
Verifique se você não possui o método -asdf implementado nessa classe haha
Ou indexe além da exceção vinculada:
E claro
kill( getpid(), SIGABRT );
fonte
Eu acho que no Swift você pode facilmente lançar um erro fatal:
Na verdade, pretende-se usar esse recurso, caso algo dê errado, a fim de causar o travamento do aplicativo.
Para evitar uma declaração if em um caso especial, você também pode usar
precondition
. É semelhante aassert
, torna assim a intenção (se desejada) bastante clara e não é removida no lançamento final comoassert
. É usado comoprecondition(myBoolean, "This is a helpful error message for debugging.")
.fonte
Enviar uma mensagem para um objeto desalocado
fonte
(deve ... digitar ... 30 caracteres)
fonte
Você também pode gerar uma exceção:
fonte
Adicione um reconhecedor de gestos a uma exibição que reconheça um toque de 10 dedos (5 dedos para iPhone, pois 10 podem ficar um pouco cheios). O GR possui um método anexado que executa qualquer uma das maneiras infalíveis mencionadas anteriormente para travar o aplicativo. A maioria dos usuários não coloca dez dedos no seu aplicativo, portanto, você estará protegido contra o usuário geral que causa o acidente acidentalmente.
No entanto, você deve poder usar algo como o Testflight ou simplesmente implantá-lo em dispositivos pessoais e testar em ambiente selvagem antes de enviá-lo à Apple. Ter uma falha forçada pode fazer com que seu aplicativo seja rejeitado pela Apple.
fonte
poderia tentar algo como
deve travar em um EXC_BAD_ACCESS (pode ser necessário liberá-lo uma segunda vez, mas normalmente já deve travar assim)
fonte
Eu irei com:
int raise(int sig);
Para obter mais informações
>man raise
fonte
Eu mataria o processo normalmente:
Portanto, se você instalar um manipulador com sinal, também poderá lidar com a falha, terminando de gravar arquivos abertos e essas coisas.
fonte
eu uso
fonte
Ao trabalhar com RubyMotion, eu uso este:
fonte
Tente o seguinte:
fonte
uma
NSLog
declaração errada fará issofonte