Использование Valgrind на симуляторе iPhone в Mac OS X Snow Leopard - PullRequest
6 голосов
/ 24 января 2011

Из-за случайных сбоев памяти в моей программе на iOS я решил использовать Valgrind, чтобы помочь устранить проблему, поскольку у них есть порт, который работает на 32-битной Mac OS X. Я следовал инструкциям на этой веб-страниценастроить Valgrind на симуляторе iPhone здесь:

http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind.20081224.html

Однако, хотя я могу заставить программу компилироваться в симуляторе iOS и установить флаги препроцессора, я не смог получитьValgrind на самом деле запустить мою программу.Он всегда завершается со следующей ошибкой:

valgrind: /Users/megahub/Library/Application Support/iPhone Simulator/4.2/Applications/6FD1FFF3-0EFB-4D81-A95A-F02E0AA9095E/QuamStockAdHoc.app/QuamStockAdHoc: cannot execute binary file

cannot execute binary file

Как я могу решить эту проблему?Я убедился, что исполняемый файл присутствует по этому пути, потому что я могу запустить его без Valgrind в симуляторе.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2011

Компилятор по умолчанию является 64-битным (при условии, что у вас есть 64-битная машина), но valgrind официально не поддерживает 64-битные исполняемые файлы в Mac OS X (насколько я знаю, я могу ошибаться).Команда file на вашем исполняемом файле должна сообщать "Mach-O исполняемый файл i386".Также убедитесь, что у вас есть 32-битные версии всех библиотек, которые вы используете.

0 голосов
/ 03 декабря 2011

Могут быть и другие причины, которые вызывают это сообщение, но распространенная причина - попытка использовать valgrind для 32-битного исполняемого файла, когда он был скомпилирован для запуска только на 64-битных исполняемых файлах. (MacPorts на момент написания этой статьи делает это на 64-битных ОС). Это не относится к симулятору: попытка valgrind любого 32-битного приложения приведет к этому.

Собственная установка из источника valgrind без дополнительных аргументов для configure будет работать на 32- или 64-битных исполняемых файлах.

Это не дает мне возможности полностью запустить valgrind в симуляторе. Еще нет ...

Продолжение:

Правильное определение ширины не слишком далеко. Как упоминалось где-то еще, на самом деле требуется портирование valgrind во время выполнения симулятора. Он должен использовать все SDK для платформы так же, как целевое приложение.

Оказывается, это возможно. Не легко, и я не уверен, насколько оно стабильно, но возможно. Я думаю, что поговорю с людьми из valgrind о том, можно ли это как-то очистить и сделать поддерживаемый порт / цель.

Когда это работает, это прекрасно:

  char* p = new char[10];
  delete p;
  *p = 12;

превращается в

==49084== Invalid write of size 1
==49084==    at 0x6C536: -[AppDelegate application:didFinishLaunchingWithOptions:] (app_delegate.mm:813)
==49084==    ...
==49084==  Address 0xc6cca70 is 0 bytes inside a block of size 10 free'd
==49084==    at 0xC51041: free (vg_replace_malloc.c:430)
==49084==    by 0x6C52F: -[AppDelegate application:didFinishLaunchingWithOptions:] (app_delegate.mm:812)
==49084==    ...

Красивые символы и номера строк. Замечательно.

Статус:

Я дошел до того, что Вальгринд отразится на dllib от Apple, sqlite3. Я не уверен на 100%, почему, но я думаю, что это потому, что в версии sqlite3 от Apple есть некоторые вызовы машин, которые valgrind не покрывает. Так что я никогда не заставлял его работать в моем приложении. Я поднял тему в списке valgrind, но это не вызвало никакого интереса. Я все еще хотел бы заставить это работать, но это не произойдет слишком рано ... по крайней мере, не мной.

Хммм ... интересно, могу ли я вызвать какой-либо интерес к WWDC ...

0 голосов
/ 16 февраля 2011

Зачем в первую очередь использовать valgrind?У вас есть NSZombie и его друзья, а также инструменты с проверкой на утечку.

Как настроить:

  1. Перейдите в Xcode, выберите свой созданный продукт (.app), дважды щелкните по нему.(в Xcode 4 Menubar-> Product-> Edit Scheme)
  2. Добавьте новую переменную среды с именем "NSZombieEnabled" и установите значение "YES"

В качестве альтернативы для большего контроля:

  1. Создайте новый файл в вашем домашнем каталоге с именем ".gdbinit" (обратите внимание на точку перед ним) со следующим содержимым:

    fb - [повышение NSException]
    fb - [NSAssertionHandler handleFailureInFunction: file: lineNumber: описание:]
    fb - [NSAssertionHandler handleFailureInMethod: объект: файл: lineNumber: описание:] *
    установить env MallocHelp = YES
    установить env NSZombieEable1021 * установить env NSDeallocateZombies = НЕТ
    установить env MallocCheckHeapEach = 100000
    установить env MallocCheckHeapStart = 100000
    установить env MallocScribble = ДА
    установить env MallocGuardEdges = ДА * 1027B * установить 1set env CFZombie 5
    fb - [_ NSZombie init]
    fb - [_ NSZombie retainCount]
    fb - [_ NSZombie retain]
    fb - [_ NSZombie release]
    fb - [_ NSZombie autorelease]
    fb - [_ NSZombie methodSignatureForSelector:]
    fb - [_ NSZombie responseSoSelector:]
    fb - [_ NSZombie forwardInvocation:] *
    fb - [_ NSZombie class]
    fb - [_ NSZombie dealloc]fb szone_error

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

...