실제 사용자가 실수로 할 수없는 특정 작업을 수행 할 때 의도적으로 충돌하여 응용 프로그램의 충돌 보고서를 현장에서 테스트하고 싶습니다.
그러나 컴파일 타임에 경고를 생성하지 않는 앱 충돌을 일으키는 신뢰할 수있는 좋은 방법은 무엇입니까?
편집 : 이 질문에 대한 많은 명백한 대답은 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
까지 이러한 모든 아이디어를 얻고 있습니다 ! 요즘 앱 충돌을 일으키는 것이 어렵다는 것을 누가 알았습니까?