2010-06-26 2 views
4

Я только что вытаскиваю свои волосы, пытаясь заставить Инструменты кашлять в моих сознательно сконструированных утечках памяти. Мой пример теста выглядит так:Проверка утечки памяти с помощью инструментов на Mac

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; 
} 

В основном приборы никогда не находили очевидных утечек. Я с ума сходил, но затем обнаружил «sec Between Auto Detections» в панели «Конфигурация утечек» на панели «Утечки». Я набрал его так низко, как это было бы, что было 1 секундой, и поместил сон (2) в мой код и вуаля; найдены утечки!

Насколько я знаю, утечка является утечкой, независимо от того, происходит ли это 30 минут в приложении или 30 миллисекунд. В моем случае я отменил тестовый пример до вышеуказанного кода, но мое реальное приложение - это приложение с командной строкой без интерфейса или что-то еще, и оно выполняется очень быстро; конечно, меньше интервала выборки по умолчанию 10 секунд.

Итак, я могу прожить пару секунд после выхода из моего приложения в режиме инструментария, но то, что я ДЕЙСТВИТЕЛЬНО хочу, состоит в том, чтобы просто иметь память снимков инструментов при выходе, а затем делать все, что нужно, с течением времени, когда приложение бежит.

Итак ... вопрос в том, есть ли способ сделать снимки памяти инструментов при выходе из приложения независимо от интервала выборки?

Cheers,

Шейн

ответ

3

Instruments, в утечках режим может быть очень мощным для отслеживания утечек, но я обнаружил, что это больше склоняется к базе событий приложений с графическим интерфейсом, чем программы командной строки (в частности, те, которые выходят через короткое время). Раньше был CHUD API, где вы могли программно контролировать аспекты инструментария, но в прошлый раз, когда я это пробовал, рамки больше не предоставлялись как часть SDK. Возможно, некоторые из них теперь заменены на Dtrace.

Кроме того, убедитесь, что вы в курсе Xcode, поскольку в этой области были некоторые улучшения в этой области, которые могли бы облегчить выполнение необходимых действий. Вы также можете сохранить короткую задержку перед выходом, но сделать ее обусловленной наличием переменной окружения, а затем установить эту переменную среды в свойствах запуска инструментов для вашего приложения, так что работа за пределами инструментов не имеет задержки.

+0

Да, я согласен, инструменты, кажется, направлены на Event Driven среды. Кроме того, мой XCode всегда на последней версии из-за программирования iPad/iPhone. DTrace было хорошим предложением, я рассмотрю его. На этом этапе я действительно думаю, что просто оставлю 2 секунды в конце. Это работает, но немного раздражает. – Shane

0

Я только что решил оставить 2-секундную задержку во время моего отладки + утечки сборки.

1

Большинство модулей тестирования модулей выполняют необходимые коды и выходы кода. Хотя это совершенно нормально для модульного тестирования, это создает проблему для инструмента утечки, для которого требуется время для анализа пространства памяти процесса. Чтобы устранить эту проблему, вы должны убедиться, что ваш код тестирования устройства не выходит сразу после завершения его тестов. Вы можете сделать это, поставив процесс на неопределенное время, вместо того, чтобы нормально выходить.

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

 Смежные вопросы

  • Нет связанных вопросов^_^