문제

나는 일반적으로 iPhone Development와 Xcode를 처음 접했으며 문제 해결을 시작하는 방법을 전혀 모른다. EXC_BAD_ACCESS 신호. Xcode가 오류를 일으키는 정확한 줄에서 끊어 지도록하려면 어떻게해야합니까?


Xcode가 라인에서 멈출 수는 없지만 문제가 발생합니다. 그러나 디버그 콘솔에서 다음 줄이 보입니다.

Sun Oct 25 15:12:14 Jasonsmacbook TestProject [1289] : CGCONTEXTSETSTROKECOLORWITHCOLOR : 유효하지 않은 컨텍스트

Sun Oct 25 15:12:14 Jasonsmacbook TestProject [1289] : cgcontextsetlinewidth : 유효하지 않은 컨텍스트

Sun Oct 25 15:12:14 Jasonsmacbook TestProject [1289] : CGContextAddPath : 잘못된 컨텍스트

Sun Oct 25 15:12:14 Jasonsmacbook TestProject [1289] : CGContextDrawPath : 잘못된 컨텍스트

2009-10-25 15 : 12 : 14.680 LanderTest [1289 : 207] ***-[Cfarray Objectatindex :] : 메시지가 처리 된 인스턴스로 전송 된 메시지 0x3c4e610

이제 나는 내가 검색하는 맥락에 끌려 가고있다. UIGraphicsGetCurrentContext() 그리고 내가 그리고 싶은 물체로 전달됩니다.


추가 시행 및 오류 디버깅과 나는 NSMutableArray 나는 수업 시간에 좀비였다. 나는 들어갔다 init 클래스의 기능과 여기에 내가 사용했던 코드는 다음과 같습니다.

if ((self = [super init])) {
        NSMutableArray *array = [NSMutableArray array];
        self.terrainBlocks = array;
        [array release];
    }
    return self;    
}

나는 그것을 제거했다 [array release] 라인과 그것은 더 이상 나에게주지 않습니다 EXC_BAD_ACCESS 신호이지만 이제 이것이 왜 작동하는지 혼란스러워합니다. 나는 그 부동산을 사용했을 때 자동으로 나를 위해 그것을 유지했다고 생각했기 때문에 내면에서 그것을 공개해야합니다. init 누출이 없도록. 나는 이것이 어떻게 작동하는지에 대해 완전히 혼란스러워하고 읽은 모든 가이드 및 stackoverflow 질문은 Init Method 내에서 속성을 설정하는 방법에 대해 더 혼란스럽게합니다. 어느 길이 가장 좋은지에 대한 합의가없는 것 같습니다.

도움이 되었습니까?

해결책

exc_bad_access 오류의 경우 일반적으로 릴리스 객체에 메시지를 보내려고합니다. 그만큼 베스트 이것들을 추적하는 방법은 사용됩니다 nszombieenabled.

이것은 실제로 객체를 풀어주지 않지만 "좀비"로 마무리하고 그 안에 깃발을 설정하여 일반적으로 출시되었을 것입니다. 이런 식으로 다시 액세스하려고하면 오류를 만들기 전에 그것이 무엇인지 여전히 알고 있으며이 작은 정보를 사용하면 일반적으로 문제가 무엇인지 확인할 수 있습니다.

디버거가 때때로 유용한 정보를 얻을 때 특히 백그라운드 스레드에 도움이됩니다.

주목하는 것이 매우 중요합니다 그러나 100% 배포 코드가 아닌 디버그 코드에만 있는지 확인해야합니다. 아무것도 해제되지 않기 때문에 앱이 누출되고 누출되고 누출됩니다. 이 작업을 상기시키기 위해이 로그인을 AppDelegate에 넣었습니다.

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

정확한 라인을 찾는 데 도움이 필요한 경우 빌드 앤 데그를 수행하십시오 (CMD-Y) 빌드 앤 라이닝 대신 (CMD-R). 앱이 충돌하면 디버거가 NSZombieEnabled와 함께 정확히 어떤 라인을 표시하고, 정확히 이유를 찾을 수 있어야합니다.

다른 팁

배열에 대해. 라인

NSMutableArray *array = [NSMutableArray array];

실제로 보유 된 객체가 아니라 자동 제출 객체를 제공합니다. 아마도 다음 줄에 유지되지만 세 번째 줄에서 해제해서는 안됩니다. 보다 이것

이것이 기본 규칙입니다.

이름이 "Alloc"또는 "New"로 시작하거나 "Copy"(예 : Alloc, NewObject 또는 MutableCopy)를 포함하는 메소드를 사용하여 객체의 소유권을 얻거나 메시지를 보내는 경우 객체를 작성하는 경우 객체의 소유권을 얻습니다. 귀하는 릴리스 또는 자동 제출을 사용하여 소유 한 객체의 소유권을 포기해야합니다. 다른 시간에 당신은 객체를받을 때마다 그것을 해제해서는 안됩니다.

Xcode 4에서는 체계 드롭 다운 (왼쪽 상단, 정지 버튼 바로 옆)을 클릭하여 좀비를 활성화 할 수 있습니다 -> Scheme 편집 -> 진단 탭 -> 좀비 개체 활성화

xcode/gdb는 항상 깨집니다 EXC_BAD_ACCESS, 당신은 그것을 트리거 된 코드를 찾으려면 통화 스택을 위로 올리면됩니다.

이러한 종류의 오류는 종종 발생합니다 autoreleased 객체, 즉 문제의 궁극적 인 원인이 트리거 된 통화 스택에 있지 않음을 의미합니다. EXC_BAD_ACCESS. 그때는 nszombieenabled와 nsautoreleasefreedobjectcheckenabled가 도움이 될 때입니다.

오래된 스레드에 대한 새로운 답변 ... Xcode 4에서 exc_bad_access 예외를 진단하는 가장 효과적인 방법은 악기를 사용하여 앱을 프로파일 링하고 (Xcode Click Product/Profile에서, 좀비를 선택하는지)입니다. 이렇게하면 처리 된 객체로 전송 된 메시지를 식별하는 데 도움이됩니다.

스탠포드 CS193P 클래스 : 심볼에 대한 중단 점 (수동으로 중단 점)을 추가하는 경우objc_exception_throw 당신은 무엇이 잘못되었는지에 대한 훨씬 더 나은 그림을 얻을 수 있습니다. 디버거 자체가 멈추는 지점으로 물건을 가리게하는 것은 물건을 모호하게하고 스택 추적을 망치는 경향이 있습니다. OBJC_Exception_Throw를 중단하면 액세스/작동이 문제로 인한 정확히 정확히 되돌아 볼 수 있습니다.

또 다른 유용한 접근 방식은 예외가 발생한 후 바로 트리거되는 설정 중단 점입니다.

브레이크 포인트 창 (실행 - 쇼 - 브레이크 포인트)을 열고 "OBJC_Exception_throw"와 [nsexception rase]라는 두 가지 상징적 중단 점을 추가하십시오.

에서: http://blog.emmerinc.be/index.php/2009/03/19/break-on-exception-in-xcode/

웹에서 오는 다른 사람들을 추가하고 동일한 오류에 대한 솔루션을 검색하지만 실수로 추가하고 싶었습니다. 내 경우에는 키 이름으로 오타를 사용하여 nsdictionary를 인스턴스화하려고 할 때 동일한 오류가 발생했습니다.

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: myObj1, @"goodKey", myObj2, "badkey @ is missing in front", nil];

동일한 답변을 놓치지 않았기를 바랍니다. 그러나 프로젝트 종속성 또는 프레임 워크와 호환되지 않는 이전 iOS 버전의 시뮬레이터에서 실행되어 일부 프로젝트 가이 오류를 던질 수 있음을 발견했습니다. iPhone 4S와 같은 -older- 시뮬레이터 버전에서 일어나고 있다는 사실을 깨닫기 전에 너무 오랫동안이 중 하나를 쫓아 가고 있었지만 앱은 지원을 시도하지도 않았습니다.

더 긴장된 오류 메시지를 얻는 것이 좋았을 것입니다. 그러나 그것이 그것이 시작된 프레임 워크의 책임이라고 생각합니다 ... 어쨌든 이것은 상당히 일반적인 검색 착륙이며 아마도 누군가가 심하게 겨냥하는 사람이 나쁘게 겨냥하는 데 도움이 될 것입니다. 내가 찾은대로.

좀비를 활성화하기 전에 먼저 모든 경고를 제거하는 것이 좋습니다 (있는 경우). a가없는 빈 공간 기능과 같은 단순한 것 return이 오류가 발생할 수 있습니다. 다른 답변이 제안한대로 경고가 없다면 진행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top