수색…


충돌에 대한 정보 찾기

응용 프로그램이 충돌하면 Xcode가 디버거에 들어가고 충돌에 대한 자세한 정보를 보여줍니다.

여기에 이미지 설명을 입력하십시오.

가장 중요한 부분은 다음과 같습니다.

빨간색 화살표

빨간색 화살표는 어떤 코드 줄이 충돌하고 왜 충돌했는지 표시합니다.

디버거 콘솔

많은 충돌이 디버거 콘솔에 자세한 정보를 기록합니다. 앱이 다운되면 자동으로 표시되지만, 앱이 없으면 앱을 선택하여 디버거를 표시합니다. 여기에 이미지 설명을 입력하십시오. 버튼을 클릭하여 Xcode의 오른쪽 상단 모서리에있는 여기에 이미지 설명을 입력하십시오. 디버거의 오른쪽 하단 구석에있는 버튼을 클릭하십시오.

스택 트레이스

스택 추적은 프로그램이 충돌 한 코드에 도달하기 전에 프로그램이 제공 한 기능을 나열합니다.

스택 트레이스의 일부는 화면 왼쪽의 Debug Navigator에 표시되고 디버거 컨트롤을 사용하면 디버거에서 볼 스택 프레임을 선택할 수 있습니다.

여기에 이미지 설명을 입력하십시오.

디버거의 (lldb) 프롬프트에서 bt 명령을 입력하고 return 키를 누르면 복사하여 붙여 넣을 수있는 스택 추적의 텍스트 표현이 표시됩니다.

(lldb) bt
* thread #1: tid = 0x3aaec5, 0x00007fff91055f06 libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x00007fff91055f06 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x000000010008142d libsystem_pthread.dylib`pthread_kill + 90
    frame #2: 0x00007fff96dc76e7 libsystem_c.dylib`abort + 129
    frame #3: 0x00007fff8973bf81 libc++abi.dylib`abort_message + 257
    frame #4: 0x00007fff89761a47 libc++abi.dylib`default_terminate_handler() + 267
    frame #5: 0x00007fff94f636ae libobjc.A.dylib`_objc_terminate() + 103
    frame #6: 0x00007fff8975f19e libc++abi.dylib`std::__terminate(void (*)()) + 8
    frame #7: 0x00007fff8975ec12 libc++abi.dylib`__cxa_throw + 121
    frame #8: 0x00007fff94f6108c libobjc.A.dylib`objc_exception_throw + 318
    frame #9: 0x00007fff8d067372 CoreFoundation`-[__NSPlaceholderArray initWithObjects:count:] + 290
    frame #10: 0x00007fff8d0eaa1f CoreFoundation`+[NSArray arrayWithObject:] + 47
  * frame #11: 0x0000000100001b54 test`main(argc=1, argv=0x00007fff5fbff808) + 68 at main.m:15
    frame #12: 0x00007fff8bea05ad libdyld.dylib`start + 1
    frame #13: 0x00007fff8bea05ad libdyld.dylib`start + 1

디버깅 SIGABRT 및 EXC_BAD_INSTRUCTION 충돌

SIGABRT 또는 EXC_BAD_INSTRUCTION은 일반적으로 일부 검사가 실패했기 때문에 의도적으로 응용 프로그램 자체가 손상되었음을 의미합니다. 이들은 더 많은 정보를 가지고 디버거 콘솔에 메시지를 기록해야합니다. 자세한 정보를 확인하십시오.

많은 SIGABRT 는 잡히지 않는 Objective-C 예외 때문에 발생합니다. 예외가 발생할 수있는 많은 이유가 있으며 항상 유용한 정보를 콘솔에 기록합니다.

  • NSInvalidArgumentException 앱이 잘못된 인수를 메소드에 전달 NSInvalidArgumentException 의미합니다.
  • NSRangeException , 즉 앱이 NSArray 또는 NSString 과 같은 객체의 범위를 벗어난 인덱스에 액세스하려고 NSRangeException 의미합니다.
  • NSInternalInconsistencyException 은 예기치 않은 상태에 있음을 발견 한 객체를 의미합니다.
  • NSUnknownKeyException 일반적으로 XIB에 잘못된 연결이 있음을 의미합니다. 이 질문에 대한 답을 찾아보십시오.

디버깅 EXC_BAD_ACCESS

EXC_BAD_ACCESS 는 프로세스가 NULL 포인터를 역 참조하거나 읽기 전용 메모리에 쓰는 것과 같이 잘못된 방식으로 메모리에 액세스하려고 시도 EXC_BAD_ACCESS 의미합니다. 그것은 일반적으로 오류 메시지가없는, 일부 충돌이 재현 및 / 또는 문제에 전혀 관계가없는 코드에서 발생하기 매우 어려울 수 있기 때문에, 디버깅 충돌의 가장 어려운 종류이다. 이 오류는 Swift에서 매우 드물지만 오류가 발생하면 컴파일러 최적화를 줄임으로써 디버그가 더 쉽게 손상 될 수 있습니다.

대부분의 EXC_BAD_ACCESS 오류는 NULL 포인터를 역 참조하려고 시도하여 발생합니다. 이 경우 빨간색 화살표로 표시된 주소는 대개 일반 메모리 주소 (종종 0x0 보다 낮은 16 진수입니다. 디버거에서 중단 점을 설정하거나 간혹 printf / NSLog 문을 추가하여 해당 포인터가 NULL 이유를 알아보십시오.

신뢰성이 EXC_BAD_ACCESS 거나 전혀 이해가되지 않는 EXC_BAD_ACCESS 는 메모리 관리 문제의 결과 일 수 있습니다. 이 문제를 일으킬 수있는 일반적인 문제는 다음과 같습니다.

  • 할당이 해제 된 메모리 사용
  • C 배열 또는 다른 종류의 버퍼 끝을 지나서 쓰려고합니다.
  • 초기화되지 않은 포인터 사용

Scheme Editor의 Diagnostics 섹션에서 Xcode에는 메모리 문제를 디버그하는 데 도움이되는 몇 가지 유용한 도구가 포함되어 있습니다.

여기에 이미지 설명을 입력하십시오.

주소 소독 프로그램은 메모리 문제가 발생할 때마다 응용 프로그램을 중지하고 정확한 결과를 설명하는 유용한 오류 메시지를 제공하는 많은 검사를 추가합니다. 좀비 객체는 할당 된 Objective-C 객체의 문제를 감지하지만 Automatic Reference Counting이 켜져 있으면 이러한 종류의 문제를 일으키지 않아야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow