2009-11-08 2 views
2

내 아이폰 앱에 이상한 문제가있다. 내 생각에 메모리 관련 문제가있다.iPhone OS 메모리 문제 - 어떻게 디버깅 하시겠습니까?

한순간에 나는 배열을 정렬해야하는데, 그 배열은 -[sortArrayUsingFunction]으로 정렬해야한다.

메서드 호출 전에 void *test = malloc(2 * sizeof(int))과 같은 메모리를 할당하거나 정렬 함수에서 NSLog() (예 : 호출되지 않음)을 호출하지 않으면 결과가 올바르지 않습니다.

즉 정렬 기능은 정렬 기능을 호출하기 전에 사용 된 메모리를 약간 늘리면 작동합니다. 나는 이것이 어떤 점에서 기억이 손상되기 때문이라고 생각한다.

어떻게 이런 식으로 디버깅합니까?

+0

NSMutableArray sortUsingFunction을 사용하여 다음과 같이 가정합니다. context :? 정렬 기능을 게시해야합니다. – TechZen

+0

정렬 기능 게시는 내 앱의 (너무 복잡한) 컨텍스트를 알지 않으면 도움이되지 않습니다. 또한 정렬 기능에 문제가 있다고 생각하지 않습니다. 왜냐하면 문제는 항상 실패하기 때문입니다. – mrueg

답변

3

코드 일부가 이미 출시 된 객체를 사용하고있는 것처럼 들립니다. 이러한 종류의 오류를 디버깅하는 데 도움이되는 정보는 Apple의 Mac OS X Debugging Magic 기술 자료, 특히 foundation 부분에 나와 있습니다.

귀하의 경우에는 자동 복구 풀 (환경 변수 NSEnableAutoreleasePool=NO 설정)을 비활성화하거나 좀비 기능 (NSZombieEnabled=YES)을 사용하여 출시 된 개체에 메시지를 보내는 장소를 찾으십시오.

+0

NSEnableAutoreleasePool = NO로 설정하면 문제가 사라지는 것 같습니다. 하지만 NSZombieEnabled를 설정할 때 메시지가 표시되지 않고 NSEnableAutoreleasePool을 NO로 설정하지 않고 main.m에서 풀을 nil로 설정하면 문제가 여전히 남아 있습니다. 매우 이상하지만 autorelease _might_ 문제가 될 수 있습니다. – mrueg

+0

좋아요, 지금은 과다 출시가 아마 문제 일 겁니다. 먼저 정적 분석기 (clang)를 시도하십시오. 그런 다음 문제를 찾지 못하면 의심스러운 개체를보고 유지하십시오. 그런 다음 문제가 사라지면 시간 전에 출시 된 개체를 알 수 있습니다. –

+0

B.t.w .: 물론 좀비 탐지를 활성화 할 때 자동 해제 풀을 활성화해야합니다. –

0

이러한 일은 디버깅에 어려움이 될 수 있습니다. 범위를 벗어나는 액세스와 다른 플랫폼에서이를 탐지 할 수있는 몇 가지 도구가 있으므로 iPhone에 대해 뭔가있을 것으로 추측됩니다. 그러나 어떤 것도 모릅니다.

아마도 배열의 복사본을 두 개 저장하고 차이점을 비교해야합니다. 차이점을 인쇄하십시오. 배열 중 하나에 도입 된 "정크"의 본질은 어디서 왔는지에 대한 힌트를 줄 수 있습니다.

또한이 시점 이전에 실행되는 코드를 살펴보고 다시 읽으십시오 (또는 더 잘 읽으면 다른 사람에게 읽게하십시오). 버그를 발견 할 수 있습니다.

관련 문제