2010-06-24 3 views
1

나는 이것에 2 일을 보냈다. 그리고 나는 아직도 충돌의 원인을 발견 할 수 없다.NSZombie없이 EXC_BAD_ACCESS 추적 중입니까?

해제 된 개체에 액세스하려고 할 때와 관련이 있지만 어떤 액세스 또는 개체를 모르는지 알고 있습니다.

Google에서 EXC_BAD_ACCESS의 소스를 찾으려고 할 때마다 NSZombies를 사용하는 것이 좋습니다. 문제는 좀비 (환경 변수를 통해 xcode 또는 ObjectAlloc 속성을 통해 도구에서 xcode)를 활성화 할 때 문제가 발생합니다. 일반적으로 프로그램이 충돌하지 않고 좀비가 아무 것도보고하지 않습니다 (로그에 아무것도 나타나지 않고 플래그가없는 부분이 있음). 악기). NSZombie에서 누락 된 것이 있습니까?

저는 xcode의 디버거와 Instrument의 ObjectAlloc에서 일부 정보를 활용하려고 시도했지만 모든 정보는 매우 신빙성이 있으며 실제로 도움이되지 않습니다.

나는 objective-c 예외에서 멈추도록 디버거를 설정했습니다. 그것이 수행 할 때 다음과 같은 호출 스택이 표시됩니다.

0 objc_msgSend 
1 ?? 
2 -[UITableViewCell removeFromSuperView] 
3 -[UIView dealloc] 
... etc ... 

우선 '무엇이'? ' ? 의문점은 무엇을 의미합니까? 둘째로 이것이 내 코드에서 어디에서 호출되었는지 어떻게 알 수 있습니까? 명시된 모든 작업은 너무 일반적입니다 (예 : UIView dealloc, UIView 및 Where?).

또한 예외가 발생하면 어셈블리 코드를 가리키며 코드가하는 일을 알아 내려고 노력하지 않는 한 나에게 아무런 도움이되지 않습니다. 나는 약간의 집합을 알고있다. 그러나 거기에 는 더 좋은 길인를 가지고있다. .. 오른쪽?

예외가 발생하기 전에 내 코드에서 실행 된 마지막 줄이 무엇인지 의미있는 정보를 얻을 수있는 방법이 있습니까?

일부 NSLog 및 브레이크 포인트를 뿌리려고했지만 충돌이 발생하기 때문에 많은 도움이되지 않습니다. 이후 탐색 컨트롤러에서보기 컨트롤러가 나옵니다. 어디에서나 중단 점을 잘게 break는 중단 점을 배치합니다 (나는 을 깨고 충돌을 일으킬 수있는 지점을 찾을 수 없습니다). 디버거에서 예외가 발생하는 경우에만 '계속'합니다. 충돌이 내 코드 외부에서 발생하는 것처럼 그것은 어디에서 핸들을 얻는 지 전혀 모릅니다.

나는 내 코드를 조사한 결과, 적어도 내 지식에 따라 모든 메모리 관리 규칙을 준수하는지 확인했다. 나는 그것이 매우 미묘한 뭔가라고 확신하지만 그것을 찾을 수 없을 것입니다.

누군가 NSZombie없이 이러한 버그를 찾는 방법을 알고 있다면 공유하십시오.

감사합니다.

+1

디버그 모드로 실행 해 보셨습니까? 오류가 발생하면 바로 중지해야하며 스택 추적은 오류의 원인이되는 코드 행과 객체로 안내합니다. – Eiko

+0

'디버그 모드'는 무엇을 의미합니까? xcode에서 '빌드 및 디버그'를 의미하고 디버거와 활성 구성 = 디버그를 사용하는 경우 그렇습니다. 제 질문에 언급 된대로 시도했습니다. 문제는 스택 추적이 너무 막연했다는 것입니다 (내 질문에 게시 된 샘플 참조). 내 코드에서 문제가있는 부분을 찾는데 도움이되지 못했습니다. 만약 내가 모르는 다른 디버그 모드에 대해 이야기하고 있다면, 정교하게 말하십시오. 나는 xcode (~ 1 개월)에 상당히 익숙하기 때문에 내가 모르는 기능이있을 수 있습니다. – nebs

답변

1

글쎄, 문제를 발견했습니다. 나는 dealloc 메서드에서 (최후보다는) [super dealloc]이라고하는 사용자 정의 테이블 셀 클래스를 가졌습니다. 나는이 수업을 서둘러 쓰고 실제로 생각하지 않았다. 아이가 석방에 필요한 부모에게서 석방 된 것이 있다고 생각하니?

내 자신의 질문에 대한 실제 답변이 없지만 기본적으로 ad-hoc 코드 추적과 다양한 디버깅 기술 (중단 점, NSLogs, 암호 스택 추적을 해독하려고 시도 함)을 조합하여 문제를 발견했습니다. .

실제로 충돌을 그대로 유지하면서 문제 영역을 간단하게 제거 할 때까지 코드를 조금씩 주석 처리하는 데 도움이되는 주요 전략이 도움이되었습니다. 이 문제는 내가 생각했던 곳이 아니지만 좀 더 미묘한 영역 (예 :이 경우에는 2 차 클래스의 dealloc 메소드)에 문제가 있음을 알게되었습니다.

나는 이것이 누군가를 도와 줄 수 있기를 바랍니다. 나는이 질문에 답을주지 않고 누군가가 NSZombies에 의지하지 않고보다 철저한 디버깅 전략을 가지고 있다고 대답 할 것이다. 또한 스택 추적에서 두 개의 물음표가 의미하는 바가 도움이 될 수 있음을 분명히 알 수 있다면.

+0

일단 "super dealloc"을 호출하면 객체 자체의 할당이 해제되어 인스턴스 변수에 액세스하는 등의 후속 사용은 유효하지 않으므로 충돌이 발생할 수 있습니다. –