2011-03-18 5 views
6

나는 며칠 동안 악명 높은 EXC_BAD_ACCESS 오류를 디버깅하고 있습니다. NSZombieEnabled = YES는 아무 것도 제공하지 않습니다. 호출 스택은 오류가 발생할 때마다 달라졌습니다. 오류는 매 5 ~ 6 회 실행됩니다.Guard Malloc이 즉시 EXC_BAD_ACCESS 오류를 발견했습니다. 왜 항상 사용하지 않습니까?

루 프랑코의 웹 사이트 Understanding EXC_BAD_ACCESS에서 guard malloc (Xcode 4의 스키마 편집기에 있음)을 사용하기위한 팁을 보았습니다. 이 작업을 마친 후 내 프로그램은이 어려운 오류를 일으키는 정확한 행에서 중지되었습니다.

설명에 따르면 guard malloc은 모든 malloc에 ​​대해 별도의 페이지를 생성하고 메모리가 해제 될 때 전체 페이지를 삭제하므로 해제 된 메모리에 액세스 할 때 프로그램이 충돌합니다. 일반적인 개발을 위해, 왜 그냥 malloc을 항상 지키지 않을까요? 그것은 특정 유형의 메모리 오류를 쉽게 잡는 것 같습니다. 메모리 관리 나 성능을 특별히 테스트하지 않는다면, 메모리 관리 나 성능에 약간의 단점이 있습니까?

답변

7

주소 공간을 낭비 할뿐만 아니라 잠재적으로 프로그램을 느리게 만듭니다 (잠재적으로 시뮬레이터에서도 사용할 수없는 지점까지). 나는 iOS 프로그램을 시뮬레이터에서 실행할 때 (메모리는 문제가 아니며 성능 저하도 끔찍하지 않다) 가정한다.하지만 모범 사례의 이름으로는 안된다. 끊임없이 실행하십시오.

3

malloc() 폐기물 주소 공간 당 몇 바이트에 대해 전체 4K 페이지 할당 매우입니다.

2

GuardMalloc은 응용 프로그램을 훨씬 느리게 실행합니다. 특히 정상적인 실행 과정에서 많은 양의 할당이있는 경우 특히 그렇습니다. 나는 대부분의 시간을 끌었다.

GuardMalloc을 켜서 스택을 변경하는 크래시를 디버깅합니다. 흔히 스택의 왼쪽에있는 객체의 맨 위에 objc_msg가 있습니다.

GuardMalloc을 사용하면 포인터가 매달려있는 임의의 영향이 방지됩니다. 포인터의 주소는 다시 사용할 수 없으며 메모리 위치가 유효하지 않게됩니다. 충돌은 스택이 손상되기 훨씬 전에 거의 즉시 발생합니다. 이것은 새로운 Objective-C뿐만 아니라 C++ 레거시 코드에도 유용합니다.

나는 풀 타임으로 다른 메모리 디버깅 도구를 남겨 두었습니다.

관련 문제