2009-08-24 4 views
11

NSAutoreleasePool가 퇴원 할 때 충돌이 발생합니다. 아마도 풀은 다른 코드에 의해 조기에 해제 된 객체를 할당 해제하려고 시도하고있을 것입니다. 내가 가지고있는 충돌은 더 이상 존재하지 않는 객체에 메시지를 보내려고 할 때 objc_msgSend입니다.objc_msgSend 내에서 충돌을 디버깅하는 가장 좋은 방법은 무엇입니까?

주어진 스택 상태에서 문제의 개체 및/또는 불법적 인 할당 해제 시점에 대한 정보를 얻을 수있는 팁/트릭/프로세스/gdb 명령은 무엇이 있습니까?

답변

16

조급 한 삭제라고 생각되면 좀비를 사용하여 가설을 확인한 다음 진행 상황을 디버그하십시오. 좀비를 활성화하면 객체가 실제로 파괴되지는 않지만 zombie 상태로 설정되어 dealloc이 호출 된 후 액세스되는 시점을 감지하는 데 도움이됩니다. 충돌의 종류에 더 NSZombieEnabled

+3

또한, Instruments의 Object Alloc 도구를 사용하여 조기에 릴리스 된 객체의 유지/릴리스 이벤트를 추적 할 수 있습니다. 그것은 autorelease 풀의 - 릴리스, 문제가 아니지만 일반적으로 일부 이전 릴리스. – bbum

+0

@Pang 방금 링크를 업데이트했습니다. – inga

3

NSZombieEnabled를 사용하는 경우 최소한 개체의 클래스를 파악할 수 있습니다.

+2

올바른 동안, tequilatango 년대 ... 얼굴이 쳐 후 일어난 적이없는 척 내 일을 계속, 중단 점을 선택 해제 코드를 실행 대답은 몇 가지 유용한 세부 사항과 함께 대답을 제공합니다. – bbum

+0

사실입니다. 적어도 외부 정보에 대한 링크를 제공 할 수있었습니다. – Wevah

2

내가 objc_msgSend의 충돌로 보이는 무엇을 가로 질러왔다. 심지어 낯선 사람은 application:didFinishLaunchingWithOptions:이었습니다. 그래서 소위 충돌이 발생하기 전에 도달하지 못했습니다!

내 경우에는 충돌이 내 코드에 도달하기 전에 부득이하게 호출 된 메모리 주소에 설정 한 중단 점으로 판명되었습니다.

enter image description here

시간 후 또는이를 알아 내기 위해 노력 그래서 나는

관련 문제