2009-10-06 3 views
2

필자가 작성한 Cocoa 응용 프로그램에 문제가 있습니다. 매시간마다 업데이트되는 타임 스탬프 파일을 구문 분석해야하며 테스트 중에 세그먼트 화 오류로 인해 오후 11시 45 분경에 일관되게 충돌이 계속 발생합니다. 할당 취소 된 객체를 메시징해야한다고 가정합니다. 객체 할당을 추적하기 위해 Xcode 설치와 함께 제공되는 도구는 무엇입니까? (잘하면) 내가 할당 해제 된 객체를 메시징하고 ​​있는지 알려주시겠습니까?어떻게 코코아 애플리케이션에서 세그멘테이션 오류를 추적 할 수 있습니까?

Mac OS X 10.5를 사용하고 있습니다.

답변

9

나는 다음과 같은 추천 :

    메시지가
  • 사용 Instruments 객체 할당 및/또는 메모리를 추적하기 위해 할당 해제 NSObjects로 전송 될 때 모니터링 할 수
  • 사용 NSZombieEnabled가 누출
+4

함께 사용하지 마십시오. NSZombieEnabled는 "누설"을 인스트루먼트에 표시합니다. – nall

+0

+1 : NSZombie 객체는 이와 같은 것을 처리하기 위해 Apple이 처방 한 방법입니다. nall과 마찬가지로 좀비가 활성화 된 Instruments를 사용하지 마십시오. –

0

내가하는 방법은 gdb이라는 명령 줄 도구를 사용하는 것입니다. Here은 사용 방법에 대한 자습서입니다. 명령 몇 가지를 배워야하지만 일단 사용하면 거의 사용하는 것이 즐겁습니다.

참고 : gbd은 C, C++ 및 Objective-C 프로그램에서 사용할 수 있습니다.

0

gdb에서 프로그램을 실행 했습니까? 이렇게하면 SIGSEGVs 때 스택과 변수를 검사 할 수 있습니다.

할당을 추적하려면 malloc_history을 사용하십시오. 이를 위해서는 MallocStackLogging 환경 변수를 설정해야합니다.

0

빠른 점을 : 해제 된 메모리 위치를 사용하면 일반적으로 EXC_BAD_ACCESS 예외가 발생합니다. 그것이 당신이보고있는 충돌 이유라면 그것은 할당 해제 문제라고 가정하는 것이 옳습니다.

0

Xcode의 디버거 (상단에 GUI가있는 gdb)에서 실행하고 충돌을 재현하십시오. 그런 다음 스택 추적을보십시오.

메시징 해제 된 오브젝트는 일반적으로 objc_msgSend의 맨 위 프레임을 갖습니다. 다음 단계는 NSZombieEnabled로 앱을 실행하고 충돌을 재현하는 것입니다. 좀비는 그 자체를 식별 할 것입니다.

+0

크래시는 재현하기가 약간 어려웠지만 충돌 로그에서 'objc_msgSend'에 오류가 발생했음을 알았습니다. – mipadi

+0

다음 단계는 NSZombieEnabled로 실행하는 것입니다. –

관련 문제