답변:
EXC_I386_GPFLT는 "당신이 할 수없는 일을했다"는 x86의 방법 인 "일반 보호 오류"를 의미합니다. 일반적으로 메모리 범위를 벗어난 액세스를 의미하지는 않지만 코드가 범위를 벗어나서 일종의 보호 위반을 만드는 방식으로 잘못된 코드 / 데이터가 사용되도록 할 수 있습니다.
안타깝게도 더 많은 컨텍스트 없이는 문제가 무엇인지 정확히 파악하기 어려울 수 있습니다. 제 AMD64 프로그래머 매뉴얼, 2005 년 Vol 2에 나열된 27 개의 다른 원인이 있습니다. 모든 계정에서 8 년 후 몇 가지를 추가했을 가능성이 높습니다. 더.
64 비트 시스템 인 경우 그럴듯한 시나리오는 코드가 "비정규 포인터"를 사용하는 것입니다. 즉, 주소의 상위 16 비트가 그렇지 않은 방식으로 64 비트 주소가 형성됨을 의미합니다. 하위 48 비트 상단의 모든 복사본 (즉, 주소의 상위 16 비트는 16 비트 바로 아래의 비트를 기준으로 모두 0 또는 모두 1이어야 함). 이 규칙은 아키텍처가 "주소 범위에서 유효한 비트 수를 안전하게 확장"할 수 있도록 보장하기위한 것입니다. 이것은 코드가 일부 포인터 데이터를 다른 것으로 덮어 쓰거나 일부 포인터 값을 읽을 때 범위를 벗어남을 나타냅니다.
또 다른 가능한 원인은 SSE 레지스터에 대한 정렬되지 않은 액세스입니다. 즉, 16 바이트로 정렬되지 않은 주소에서 16 바이트 SSE 레지스터를 읽는 것입니다.
내가 말했듯이 다른 많은 가능한 이유가 있지만 대부분은 32 비트 또는 64 비트 OS에서 "정상"코드가 수행하지 않는 작업 (예 : 잘못된 선택기 인덱스로 세그먼트 레지스터로드 또는 MSR (모델 별 레지스터)).
종종 헤더 파일에서 정보를 얻을 수 있습니다. 예를 들면 :
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
$ find usr -name \*.h -exec fgrep -l EXC_I386_GPFLT {} \;
usr/include/mach/i386/exception.h
^C
$ more usr/include/mach/i386/exception.h
....
#define EXC_I386_GPFLT 13 /* general protection fault */
좋습니다, 그래서 이것은 일반적인 보호 결함입니다 (이름에서 알 수 있듯이). "i386 일반 보호 오류"를 검색하면 많은 히트가 발생하지만 흥미로워 보입니다 .
메모리 보호는 세그먼트 설명자를 사용하여 구현됩니다. 먼저, 프로세서는 세그먼트 레지스터에로드 된 값이 유효한 설명자를 참조하는지 확인합니다. 그런 다음 계산 된 모든 선형 주소가 실제로 세그먼트 내에 있는지 확인합니다. 또한 액세스 유형 (읽기, 쓰기 또는 실행)은 세그먼트 설명 자의 정보와 비교하여 확인됩니다. 이러한 검사 중 하나가 실패 할 때마다 예외 (인터럽트) 13 (16 진 0D)이 발생합니다. 이 예외를 GPF (General Protection Fault)라고합니다.
그것은 13
헤더 파일에서 본 것과 일치하므로 똑같은 것처럼 보입니다. 그러나 응용 프로그램 프로그래머의 관점에서 볼 때 메모리를 참조해서는 안되며 하드웨어에서 구현되는 방식은 중요하지 않습니다.
Swift 4.2에서도 비슷한 예외가있었습니다. 내 코드에서 버그를 찾으려고 약 30 분을 보냈지 만 Xcode를 닫고 파생 데이터 폴더를 제거한 후에 문제가 사라졌습니다. 바로 가기는 다음과 같습니다.
rm -rf ~/Library/Developer/Xcode/DerivedData
보기를 떠날 때이 문제가 발생했습니다 (이전보기로 돌아 가기).
그 이유는
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
view.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
view.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
view.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
view.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor)
])
문제 safeAreaLayoutGuide
를 self
해결하려면 변경하십시오 .
의미는 안전 영역 대신 superview의 선행, 후행, 상단, 하단에 뷰를 정렬합니다)
이 작업을 수행하는 동안이 오류가 발생했습니다.
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:<#(nonnull id), ...#>, nil]; //with 17 objects and keys
내가 되 돌렸을 때 사라졌습니다.
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] init];
[aDictionary setObject:object1 forKey:@"Key1"]; //17 times