Проверка утечки памяти с помощью Instruments на Mac - PullRequest
4 голосов
/ 26 июня 2010

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

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

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

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

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

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

Приветствия

Шейн

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

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

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

1 голос
/ 22 мая 2015

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

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

0 голосов
/ 07 июля 2010

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

...