2010-06-26 3 views
4

나는 의도적으로 구성된 메모리 누수가 발생하도록 악기를 만들려고 노력하고 있습니다. 내 테스트 예제는 다음과 같습니다.Mac에서 Instruments를 사용하여 메모리 누수 검사

class Leaker 
{ 
public: 
    char *_array; 
    Leaker() 
    { 
     _array=new char[1000]; 
    } 

    ~Leaker() 
    { 
    } 
}; 

void *leaker() 
{ 
    void *p=malloc(1000); 
    int *pa=new int[2000]; 
    { 
     Leaker l; 
     Leaker *pl=new Leaker(); 
    } 
    return p; 
} 

int main (int argc, char **argv) 
{ 
    for (int i=0; i<1000; ++i) { 
     leaker(); 
    } 
    sleep(2); // Needed to give Instruments a chance to poll memory 
    return 0; 
} 

기본적으로 계측기는 명백한 누출을 발견하지 못했습니다. 나는 그 이유에 관해서 말하려고했지만, Leaks 패널의 "Leaks Configuration"패널에서 "sec between Between Auto Detections"를 발견했습니다. 나는 그것을 되돌릴 것이고, 1 초 였고, sleep (2)을 내 코드에 넣었다. 그리고 voila; 누수가 발견되었습니다!

내가 아는 한 누출은 앱에 30 분 또는 30 밀리 초에 관계없이 누수입니다. 필자의 경우, 테스트 케이스를 위의 코드로 되 돌렸지 만, 실제 애플리케이션은 UI가없는 커맨드 라인 애플리케이션이며 매우 빠르게 실행된다. 확실히 기본 10 초 샘플 간격보다 적습니다.

계측 모드에서 앱을 종료 할 때 몇 초가 지나면 살 수 있지만, 정말로 필요로하는 것은 단순히 기기가 종료 할 때 스냅 샷 메모리를 갖게하고 앱이 실행되는 동안 시간이 지남에 따라 필요한 모든 작업을 수행하는 것입니다. 실행 중입니다.

질문 : 샘플링 간격에 관계없이 어플라이언스가 애플리케이션 종료시 스냅 샷 메모리를 만들 수있는 방법이 있습니까?

건배,

쉐인

답변

3

악기, 누수 모드가 누출 추적 정말 강력 할 수 있지만, 나는 그것이 명령 줄 프로그램보다 이벤트 기반 GUI 애플리케이션으로 더 편견입니다 것으로 나타났습니다 (특히 단기간 후에 퇴장하는 사람). 이전에는 계측의 측면을 프로그래밍 방식으로 제어 할 수있는 CHUD API 이었지만 이전에 시도해 보았을 때 프레임 워크가 더 이상 SDK의 일부로 제공되지 않았습니다. 아마도이 중 일부는 Dtrace으로 바뀌었을 것입니다.

또한 Xcode의 최신 기능이 향상되어이 분야에서 개선 된 부분이 있으므로 필요한 것을 쉽게 처리 할 수 ​​있습니다. 또한 종료하기 전에 짧은 지연 시간을 유지할 수 있지만 환경 변수가있는 경우 조건부로 설정 한 다음 해당 환경 변수를 앱의 인스 트림 실행 속성에 설정하면 외부 계측기가 실행되는 데 지연이 발생하지 않습니다.

+0

예를 들어, 인스트루먼트는 이벤트 중심 환경에 적합하다고 생각합니다. 또한, 내 Xcode는 iPad/iPhone 프로그래밍으로 인해 항상 최신 버전입니다. DTrace는 좋은 제안이었습니다. 이 시점에서 저는 실제로 2 초를 남겨 둘 것이라고 생각하고 있습니다. 그것은 효과가 있지만 약간 성가시다. – Shane

0

디버그 + 누출 빌드 중 2 초 지연을 그대로두기로 결정했습니다.

1

대부분의 단위 테스트 코드는 원하는 코드 경로를 실행하고 종료합니다. 이것은 단위 테스트에서 완벽하게 정상이지만 프로세스 메모리 공간을 분석하는 데 시간이 필요한 누수 도구에 문제가 발생합니다. 이 문제를 해결하려면 테스트를 완료 한 즉시 단위 테스트 코드가 종료되지 않도록해야합니다. 정상적으로 종료하는 대신 프로세스를 무기한 절전 모드로 전환하여이 작업을 수행 할 수 있습니다.

https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/FindingLeaks.html