예외 코드“EXC_I386_GPFLT”의 의미는 무엇입니까?


117

예외 코드의 의미는 무엇입니까 EXC_I386_GPFLT?

상황에 따라 의미가 다른가요?

이 경우 EXC_BAD_ACCESS예외 코드 가있는 예외 유형 을 언급 하고 있습니다.EXC_I386_GPFLT

이 프로그램은 cblas_zgemm()BLAS 라이브러리를 다루는 Xcode 5.0.1로 개발되었습니다 .

대단히 감사합니다!

답변:


112

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 (모델 별 레지스터)).


24

소스를 디버깅하고 찾으려면 : 앱 (Product \ Scheme)에 대해 Zombies를 활성화하고 Instruments를 시작하고 Zombies를 선택합니다. Xcode에서 앱을 실행 한 다음 Instruments로 이동하여 녹음을 시작합니다. 앱으로 돌아가서 오류를 생성 해보십시오. 인스트루먼트는 잘못된 호출 (좀비에게)이있는 경우이를 감지해야합니다.

도움이 되었기를 바랍니다.



23

종종 헤더 파일에서 정보를 얻을 수 있습니다. 예를 들면 :

$ 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헤더 파일에서 본 것과 일치하므로 똑같은 것처럼 보입니다. 그러나 응용 프로그램 프로그래머의 관점에서 볼 때 메모리를 참조해서는 안되며 하드웨어에서 구현되는 방식은 중요하지 않습니다.


1
그러나 최신 OS는 일반적으로 메모리 보호를 위해 세그먼트를 사용하지 않습니다. 이는 모두 MMU로 수행되며 PF, 벡터 14 (일반적으로 "세그멘테이션 오류"로 표시됨)로 이어집니다.
Mats Petersson 2013-10-29

16

왜 이것이 내 단위 테스트 중에 나타 났는지 궁금했습니다.

다음을 포함하는 프로토콜에 메서드 선언을 추가했습니다 throws. 그러나 잠재적으로 던지는 방법은 특정 테스트에서 사용되지 않았습니다. 테스트에서 좀비를 활성화하는 것은 너무 많은 문제처럼 들렸습니다.

⌘K 청소가 트릭을 수행 한 것으로 밝혀졌습니다. 나는 그것이 실제 문제를 해결할 때 항상 깜짝 놀란다.


이것은 Swift에서도 나에게 해결되었습니다. 감사!
lwdthe1

8

Swift 4.2에서도 비슷한 예외가있었습니다. 내 코드에서 버그를 찾으려고 약 30 분을 보냈지 만 Xcode를 닫고 파생 데이터 폴더를 제거한 후에 문제가 사라졌습니다. 바로 가기는 다음과 같습니다.

rm -rf ~/Library/Developer/Xcode/DerivedData

2

제 경우에는 iOS 시뮬레이터에서 앱을 실행할 때 Xcode에서 오류가 발생했습니다. "오류가 무엇을 의미하는지"라는 구체적인 질문에 답할 수는 없지만 무엇이 도움이되었는지 말할 수 있으며 다른 사람에게도 도움이 될 수 있습니다.

저에게 해결책 Erase All Content and Settings은 시뮬레이터와 Clean Build Folder...Xcode였습니다.


1

보기를 떠날 때이 문제가 발생했습니다 (이전보기로 돌아 가기).

그 이유는

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)
])

문제 safeAreaLayoutGuideself해결하려면 변경하십시오 .

의미는 안전 영역 대신 superview의 선행, 후행, 상단, 하단에 뷰를 정렬합니다)


0

이것은 Xcode가 두 개의 다른 클래스에서 동일한 변수 이름을 사용하는 것처럼 보이지 않았기 때문에 발생했습니다. 새 변수의 이름을 간단히 변경했습니다.

나는 디버깅하는 동안 그것을보기 위해 충돌하는 setter로 들어가야했다. 이 답변은 iOS에 적용됩니다.


0

오류가가 정의하는 폐쇄 내부에 발생하는 경우 selfunowned, 당신은 당신이 액세스 할 수있는 제한 될 수 있으며, 특정 상황에서이 오류 코드를 받게됩니다. 특히 디버깅하는 동안. 이 경우에 변경 [unowned self]을 시도하십시오[weak self]


0

이 작업을 수행하는 동안이 오류가 발생했습니다.

 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

0

저에게는 스토리 보드와 관련된 문제가 iOS 10.0 이상에 대해 이전에 설정된 iOS 9.0 이상에 대한 ViewController 빌드 옵션이 있습니다. 실제로 버전을 10에서 iOS 9.3으로 다운 그레이드하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.