source

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

itover 2023. 8. 5. 22:49
반응형

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

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

: : double free MyApp(212,0xb0185000) malloc: 0x1068310 객체: 0x1068310 객체: 0x10185000 객체: 0x1068310 객체: 0x0185000 객체: 0x1068310 객체: 0x00 오류
을 debugmalloc_error_break으로합니다.

NSAuto releasePool을 릴리스할 때 발생하며 어떤 개체를 두 번 릴리스할지 알 수 없습니다.

그의 브레이크 포인트를 어떻게 설정합니까?

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

개체가 "이중 해제"된 경우 가장 일반적인 원인은 자동 해제된 개체를 (불필요하게) 해제하는 것이며, 포함된 자동 해제 풀을 비우면 나중에 자동 해제됩니다.

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

편집: Xcode 디버거 내에서 문제가 되는 개체를 추적할 수 있지만 Instruments를 사용하여 도움을 주는 것이 훨씬 더 쉽습니다.Xcode에서 Run → Start With Performance Tool → Object Allocations를 선택하면 문제가 발생한 개체를 다시 추적할 수 있습니다.(위에서 설명한 것처럼 좀비를 활성화한 경우 가장 효과적입니다.)참고: Snow Leopard는 Instruments에 좀비 도구를 추가하며 Run 메뉴에서도 액세스할 수 있습니다.혼자서 29달러의 가치가 있을지도 모릅니다! ;-

여기 관련 SO 질문도 있습니다.

디버거를 깨면 오브젝트가 무엇인지 알 수 있습니다.콜 스택을 조회하기만 하면 어디에서 콜 스택을 해제할 수 있는지 확인할 수 있습니다.그것은 그것이 어떤 물체인지 알려줄 것입니다.

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

  1. 실행으로 이동 -> 표시 -> 중단점(--)ALTCommandB
  2. 목록의 맨 아래로 스크롤하여 기호 추가malloc_error_break

저는 퀸 테일러의 대답에 제 경험을 덧붙이고 싶습니다.

앱 중 하나에서 데이터를 구문 분석하고 코어 데이터 개체에 저장한 다음 나중에 이러한 개체를 보기에 표시해야 합니다.사실, 앱은 정상적으로 작동하고 전혀 작동하지 않습니다. 제가 앞뒤로 여러 번 탐색하는 스트레스 테스트를 시도하고 가능한 한 빨리 여러 뷰를 열려고 시도하기 전까지는요.위의 메시지와 함께 앱이 충돌합니다.

저는 퀸이 답변에서 제안한 모든 방법을 시도했지만 여전히 정확한 원인을 찾지 못했습니다.

NSZombieEnabled=를 설정했습니다.예, NS 스택 로깅=예, shell malloc_history 명령을 실행하여 이유를 찾았지만 여전히 운이 없습니다.데이터를 핵심 데이터 객체에 저장하는 위치를 항상 알려줍니다. 사실, 저는 거기서 초과 릴리스된 객체를 수천 번 확인했지만 이상한 점은 없었습니다.

다양한 도구(할당, 누수 등)를 사용하여 계측기에서 실행해도 여전히 도움이 되지 않았습니다.경비대 말록을 활성화시켜도 아무것도 얻지 못합니다.

최종 구조:Core Data에서 객체를 가져온 뷰로 돌아가 이 모든 객체에 유지 메시지를 보내고 이러한 변경 사항에 주목했습니다.그것은 문제를 해결했습니다.

그래서 저는 하나를 유지하는 데 실패했다는 것을 알게 되었습니다. 바로 그것이 원인입니다.제 경험을 공유하여 앱에 대한 또 다른 복구 작업을 수행하고 싶습니다.

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

break malloc_error_break

시작에 브레이크 포인트를 설정하다malloc_error_break기능.

주소 0x1068310에 있는 개체를 확인하려면 디버거 콘솔에 다음을 입력합니다.

print-object 0x1068310

물론 개체가 살아 있는 동안에는 이 작업을 수행해야 합니다. 개체가 이미 해제된 경우에는 이 작업이 수행되지 않습니다.

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

중단점 네비게이터를 누릅니다.
그런 다음 아래의 "+" 버튼을 클릭합니다.
기호 중단점을 추가합니다.명단에서
기호 옵션에 "malloc_error_break" 키워드를 추가합니다.

또는 아래의 GIF 프레젠테이션을 참조할 수도 있습니다.

GIF represenation

나에게 그 문제는 다음에 의해 해결되었습니다.

(gdb) call (void)_CFAutoreleasePoolPrintPools()

였습니다.스택 맨 위에 있는 주소가 범인의 주소였습니다.내던져진retain들소

로그 메시지에 지정된 주소로는 아무 것도 얻을 수 없었습니다.그것은 다양한 악기들 중 어느 것에도 나타나지 않았습니다.이미 해제된 내부 데이터에 대한 포인터인 것 같습니다.

Xcode 4에 심볼릭 중단점 추가

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

Xcode 4 사용자 가이드에서:

심볼릭 중단점을 추가합니다.

  1. 중단점 탐색기의 왼쪽 하단 모서리에서 추가 단추를 누릅니다.
  2. 기호 중단점 추가를 선택합니다.
  3. 기호 필드에 기호 이름을 입력합니다.
  4. 완료를 클릭합니다.

이것은 Xcode의 Breakpoints 창에서 malloc_error_breakpoints의 모양입니다.작동하려면 상자를 확인해야 합니다.

alt 텍스트 http://www.martijnthe.nl/wp-content/uploads/2009/08/Afbeelding-1.png

클래스를 확인하고 할당 해제 방법을 확인합니다.전화를 걸고 있는지 확인합니다.[super dealloc].

저도 똑같은 문제가 있었는데 제가 전화를 하고 있다는 것을 알게 되었습니다.[self dealloc] 그냥 집중을 거예요.그냥 집중을 안 하는 거지.

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

생성한 개체는 사용하지 않는 것이 좋습니다.autorelease아이폰에서 메모리는 상품이기 때문입니다.Apple은 명시적으로 전화할 것을 권장합니다.release.

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

Valgrind는 OSX에서 작동할 수 있으며("지원되지 않고 불완전하고 버그가 있다"고 하지만), 약간의 해킹으로 누군가가 아이폰 SDK 실행 파일에서 작동하도록 했습니다.

XCode의 일부인 Instruments를 사용해 볼 수 있습니다.여기서 실행하는 방법에 대한 튜토리얼이 있습니다.

한다면malloc_error_break도움이 되지 않는...

이 오류를 해결하는 가장 좋은 방법은 다음을 사용하여 계측기를 실행하는 것입니다.NSZombiesㅠㅠ 으로 바로 할 수 .좀비 메시지가 표시되면 계측기에서 플래그를 지정하고 코드 줄로 바로 추적할 수 있습니다.

스노우 레오파드가 필요했어요, 하지만 얼마나 생명의 은인인가요!

이 문제는 일반적으로 Safari 또는 Safari 미리 보기와 같은 일부 검사자에 의해 발생합니다.게시물 또는 게시물을 참조하고 질문합니다.

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

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

그래도 안 되면 이 답변참조하거나 게시물을 참조하여 디버그하십시오.

deselect automatically inspect on safari preview

언급URL : https://stackoverflow.com/questions/971249/how-to-find-the-cause-of-a-malloc-double-free-error

반응형