실제 사용자가 실수로 할 수없는 특정 작업을 수행 할 때 의도적으로 충돌하여 응용 프로그램의 충돌 보고서를 현장에서 테스트하고 싶습니다.
그러나 컴파일 타임에 경고를 생성하지 않는 앱 충돌을 일으키는 신뢰할 수있는 좋은 방법은 무엇입니까?
편집 : 이 질문에 대한 많은 명백한 대답은 Cocoa에 의해 잡히는 예외를 초래하므로 앱이 중단되지 않습니다.
(void)0/0;,(void)*(char*)0;
실제 사용자가 실수로 할 수없는 특정 작업을 수행 할 때 의도적으로 충돌하여 응용 프로그램의 충돌 보고서를 현장에서 테스트하고 싶습니다.
그러나 컴파일 타임에 경고를 생성하지 않는 앱 충돌을 일으키는 신뢰할 수있는 좋은 방법은 무엇입니까?
편집 : 이 질문에 대한 많은 명백한 대답은 Cocoa에 의해 잡히는 예외를 초래하므로 앱이 중단되지 않습니다.
(void)0/0;,(void)*(char*)0;
답변:
Objective-C에서 C를 직접 사용하여 액세스가 잘못됨
strcpy(0, "bla");
참고 : 이것은 내가 알고있는 모든 시스템에서 작동하지만 향후 버전의 C 런타임 또는 컴파일러에서는 더 이상 충돌을 일으키지 않을 수 있습니다. Objective-C에서 널 포인터 역 참조가 정의되지 않은 동작입니까?를 참조 하십시오 . )
(빨리이 작업을 수행하려면 objC에 브리지해야합니다)
WebKit discarded an uncaught exception문제도 해결됩니다.
나의 현재 좋아하는 것 :
assert(! "crashing on purpose to test <insert your reason here>");
고전 :
kill( getpid(), SIGABRT );
그리고 일부 pr0n :
*(long*)0 = 0xB16B00B5;
그들 모두는 내 충돌보고 도구로 캡처 된 충돌을 생성합니다.
assert()디버그 기능이며 릴리스 빌드에서 이러한 쪼개짐 을 남기는 것은 의미가 없습니다. 이에 대한 단위 테스트가 있습니다.
assert는 디버그 기능이 아닙니다. 실패한 주장은 불가능하다고 생각한 버그입니다. 예측 불가능한 결과로 프로그램을 계속 실행하는 것보다 릴리스 빌드조차 중단하는 것이 좋습니다.
abort(); 비정상 종료를 일으킨다… 충돌이다.
Swift에서는 치명적인 오류를 쉽게 던질 수 있다고 생각합니다.
func foo() {
fatalError("crash!")
}
실제로 앱 충돌을 일으키기 위해 문제가 발생하는 경우이 기능을 사용하기도합니다.
특별한 경우에 if 문을 피하기 위해을 사용할 수도 있습니다 precondition. 와 비슷하며 assert, 의도 한 바를 명확하게하고 최종 릴리스에서로 제거 되지 않습니다assert . 처럼 사용됩니다 precondition(myBoolean, "This is a helpful error message for debugging.").
할당 해제 된 객체에 메시지 보내기
예외를 제기 할 수도 있습니다.
[NSException raise:NSInternalInconsistencyException
format:@"I want to test app crashes!."];
10 손가락 탭을 인식하는보기에 동작 인식기를 추가하십시오 (10 인 경우 iPhone의 경우 5 손가락은 약간 혼잡해질 수 있음). GR에는 앞서 언급 한 확실한 방법으로 앱을 중단시킬 수있는 방법이 첨부되어 있습니다. 대부분의 사용자는 앱에 손가락을 10 개 내려 놓지 않으므로 실수로 충돌을 일으킨 일반 사용자로부터 안전합니다.
그러나 Testflight와 같은 것을 사용하거나 개인 장치에 배포하고 Apple에 제출하기 전에 야생에서 테스트 할 수 있어야합니다. 강제 충돌이 발생하면 Apple이 앱을 거부 할 수 있습니다.
같은 것을 시도 할 수 있습니다
NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];
EXC_BAD_ACCESS에서 충돌해야합니다 (두 번째로 해제해야하지만 정상적으로는 이미 충돌 했음)
프로세스를 정상적으로 종료합니다.
kill(getpid(), SIGKILL);
따라서 신호가있는 핸들러를 설치하면 충돌을 처리하고 열린 파일 및 이러한 작업을 완료 할 수 있습니다.
WebKit discarded an uncaught exception까지 이러한 모든 아이디어를 얻고 있습니다 ! 요즘 앱 충돌을 일으키는 것이 어렵다는 것을 누가 알았습니까?