2010-04-28 4 views
0

다음은 내 스택 추적입니다. 이 부분을 어디에서 알아낼 수 있습니까? 나는 NSLog()의 톤을 시도하고 그것을 추적 할 수 없습니다.iPhone 앱에서 EXC_BAD_ACCESS 디버깅

#0 0x94e9ced7 in objc_msgSend() 
#1 0x04936318 in ??() 
#2 0x0259b252 in __CFRunLoopDoObservers() 
#3 0x0259a65f in CFRunLoopRunSpecific() 
#4 0x02599c48 in CFRunLoopRunInMode() 
#5 0x02ae7615 in GSEventRunModal() 
#6 0x02ae76da in GSEventRun() 
#7 0x0061dfaf in UIApplicationMain() 
#8 0x000051cc in main 
+0

정적 분석기는 무엇을보고합니까? (shift-command-A로 분석) NSZombieEnabled를 설정 했습니까? 출시 된 개체에 액세스하려고 할 가능성이 있습니다. –

+0

NSZombieEnabled 및 Instruments와 함께 해본 적이 있습니다. 좀비가 아니에요. – Jeff

+0

스택에서 아무 것도 평가할 수 없습니다 ... pls 코드를 넣으십시오 –

답변

0

어떻게 추적 했나요?

첫째, 모든 사용 장소 비켜갔습니다 :

NSLog(@"%s", __PRETTY_FUNCTION__, nil); 

을 충돌에 가능한 한 가까이하기 위해. 내가 그랬던 것처럼 객체가 null이되어서는 안되는 것처럼 보였습니다.

이 시점에서 NSZombieEnabled 및 Instruments와 함께 GDB는 좀비를보고하지 않았습니다.

내가 문제가있는 객체의 dealloc 및 release 메소드에 NSLoging을 추가했습니다. 마지막으로 나는 그 방법에 중단 점을 추가하고 매번 stacktrace를 볼 충분한 감각을 얻을 수있었습니다. 그 때 릴리스가 autorelease 풀에 의해 호출되고 있음을 발견했습니다.

마침내 내가 있어야한다고 생각한 것을 내가 알아 냈습니다. 일단 내가 그것을 유지, 빙고, 문제가 해결되었습니다.

NSZombieEnabled 및 Instruments 권장 사항은 그 이후로 다른 버그가 발생했기 때문에 도움이되었습니다. 감사합니다.

1

응용 프로그램이 해당 스택 추적과 충돌하면 디버깅 콘솔을 엽니 다. 충돌 시뮬레이터에있는 경우

,이 입력 장치의 경우

display /s $ecx 

는,이 입력
display /s $r1 

당신이이 일을 할 때 반드시 NSZombieEnabled이 OFF 확인하십시오.

시스템에서 호출하려고 시도하는 메서드의 이름이 인쇄됩니다.

이 작동 방식은 충돌이 발생하면 충돌하는 메소드가 존재하지 않는 메소드에 액세스하려고 할 때 충돌합니다. 따라서 메소드의 이름은 C-String으로 레지스터에 저장되며, 그 라인은 레지스터에서 그것을 가져 와서 출력합니다.