iphone - malloc "double free"오류의 원인을 찾는 방법은 무엇입니까?




objective-c memory-management (9)

Objective-C에서 응용 프로그램을 프로그래밍하고 있는데 다음 오류가 발생합니다.

MyApp (2121,0xb0185000) malloc : *** 개체의 0x1068310 오류 : 두 번 무료
*** 디버깅을 위해 malloc_error_break에 중단 점 설정

NSAutoreleasePool을 출시하면 어떤 일이 벌어지고 있는지 알 수 없으며 두 번 릴리즈 할 개체를 파악할 수 없습니다.

그의 중단 점은 어떻게 설정합니까?

이 "객체 0x1068310"이 무엇인지 알 수있는 방법이 있습니까?


Xcode 4에 기호식 중단 점 추가

Xcode 4와 관련있는 업데이트입니다.

Xcode 4 사용자 가이드 :

기호식 중단 점을 추가합니다. . .

  1. 중단 점 탐색기의 왼쪽 하단 모서리에서 추가 단추를 클릭합니다.
  2. 심볼릭 브레이크 포인트 추가를 선택하십시오.
  3. 기호 필드에 기호 이름을 입력하십시오.
  4. 완료를 클릭하십시오.

Cmd + Shift + R을 눌러 디버거 콘솔을 엽니 다. 거기에

break malloc_error_break

malloc_error_break 함수의 시작 부분에 중단 점을 설정합니다.

주소 0x1068310에있는 오브젝트를 찾으려면 디버거 콘솔에 다음을 입력하십시오.

print-object 0x1068310

물론 개체가 아직 살아있는 동안이 작업을 수행해야합니다. 개체가 이미 작업을 마칠 때까지 해제 되었다면 작동하지 않습니다.


Xcode에서 줄 번호 왼쪽을 클릭하여 중단 점을 설정합니다. 그런 다음 "빌드 및 디버그"를 실행하여 시작할 수 있습니다.

메모리가 iPhone의 필수품이기 때문에 생성하는 객체를 자동으로 가져 오지 않는 것이 좋습니다. Apple은 명시 적으로 release 호출 할 것을 권장합니다.


객체가 "double-freed"일 때, 가장 흔한 원인은 자동으로 해제 된 객체를 (불필요하게) 릴리스한다는 것이며, 나중에 자동 릴리즈 풀이 비워지면 자동으로 자동 해제됩니다.

추가 릴리스를 추적하는 가장 좋은 방법은 Xcode에서 영향을받는 실행 파일에 NSZombieEnabled 환경 변수를 사용하는 것입니다. CocoaDev 를 사용하는 방법에 대한 간단한 설명을 보려면 이 CocoaDev 위키 페이지를 확인 하십시오 . (이 페이지 외에도, Apple은 Xcode에서 코드를 디버깅하는 데 매우 모호하지만 유용한 팁을 문서화했으며 일부는 내 베이컨을 몇 번 이상 저장했습니다. 이 기술 노트 는 developer.apple.com - link에서 확인 하시기 바랍니다 . Cocoa Foundation 프레임 워크의 섹션으로 이동).

편집 : Xcode 디버거에서 문제가되는 객체를 자주 추적 할 수는 있지만, Instruments를 사용하여 도움을받는다면 훨씬 쉽습니다. Xcode에서 실행 → 성능 도구로 시작 → 개체 할당 을 선택하면 문제가있는 개체를 생성 된 위치로 다시 추적 할 수 있습니다. (위에서 설명한 것처럼 좀비가 활성화 된 경우이 방법이 가장 효과적입니다.) 참고 : Snow Leopard는 Run 메뉴에서 액세스 할 수있는 좀비 도구를 Instruments에 추가합니다. 혼자서 $ 29의 가치가있을지도 모릅니다! ;-)

여기에 관련있는 질문이 있습니다 .


디버거를 깰 때 객체가 무엇인지 알 수 있습니다. 호출 스택을 검색하면 자유롭게 찾을 수 있습니다. 그게 어떤 물건인지 말해 줄거야.

중단 점을 설정하는 가장 쉬운 방법은 다음과 같습니다.

  1. 실행 -> 표시 -> 중단 점 ( ALT - 명령 - B )
  2. 목록 맨 아래로 스크롤하여 malloc_error_break 기호를 추가하십시오.

무료 객체를 찾고 응용 프로그램을 중단하는 방법은 아래 단계를 참조하십시오.

1) " 브레이크 포인트 탐색기 "를 클릭하십시오.
2) 아래의 " + "버튼을 클릭하십시오.
3) 목록에서 " 기호식 중단 점 ... "을 추가하십시오.
4) " Symbol "옵션에 " malloc_error_break "키워드를 추가하십시오.

또는 GIF 프리젠 테이션을 참조 할 수도 있습니다.


이는 일반적으로 사파리 또는 사파리 미리보기와 같은 일부 관리자가 원인입니다. post 또는 post 및 question 참조하십시오.

자동으로 웹 표시 ....를 선택 해제하면이 문제가 제거됩니다.

닫기 사파리 또는 사파리 미리보기로는이 문제가 제거되지 않습니다. 사파리와 사파리 미리보기를 모두 취소해야합니다.

이 작업이 수행되지 않으면이 answer 참조하거나 post 하여 디버깅하십시오.


이러한 종류의 메모리 및 포인터 문제를 일반적으로 찾으려면 Valgrind 와 같은 런타임 메모리 오류 검사기에 대해 코드를 실행해야합니다. 이것은 코드가 잘못되어 많은 것을 지적 할 수 있어야한다.

Valgrind 는 OSX에서 작동 할 수 있지만 ( "지원되지 않고 불완전하고 버그가있다"), 누군가를 해킹하여 아이폰 SDK 실행 파일 로 작업 할 수있다.

Xcode의 일부인 Instruments를 사용해 볼 수도 있습니다. 여기에서 실행하기위한 자습서가 here .


malloc_error_break 가 도움이되지 않는 경우 ...

이 오류를 푸는 가장 좋은 방법은 NSZombies 가 켜진 상태에서 계측기 를 실행하는 것입니다. 인 스트 루먼트는 좀비에게 메시지가 보내지고 코드 줄로 바로 돌아갈 수있게되면 플래그를 표시합니다.

스노우 레오파드가 필요합니다.





autorelease