2010-09-28 2 views
0

Я хотел бы создать некоторые среды viables в Xcode для тяжелой отладки, такие как:Условные переменные окружения в Xcode

NSDebugEnabled 
    NSZombieEnabled 
    MallocStackLogging 
    MallocStackLoggingNoCompact 

Можно ли создать новую конфигурацию сборки, которая является дубликатом «Debug», где те, переменные окружения установлены в YES, но я могу просто переключиться на обычный Debug, и они снова исчезнут?


ответ

0

IIRC, переменные окружения установлены в «исполняемый», а не конфигурации/цели (игнорировать эту тираду, если я ошибаюсь). Возможно, вы сможете использовать замену переменной Xcode:

  • Создайте булевскую конструкцию, называемую «NSDebugEnabled». Установите переменную среды NSDebugEnabled в значение $ (NSDebugEnabled). (Возможно, это должна быть строка со значением ДА, я не уверен, насколько придирчивы переменные среды NS.)
  • Создайте параметр строковой сборки, называемый «NSDebugEnabled». Установите его в «NSDebugEnabled», чтобы включить и что-то еще (пустая строка?), Чтобы отключить. Используйте значение $ (NSDebugEnable) в качестве имени переменной среды и «YES» в качестве значения.

Если переменная замена не работает, вы может быть в состоянии назвать SETENV()/PutEnv() в самом начале основной() (перед выделением в autorelease пул), чтобы изменить окружающую среду до того, как переменные читаются; будет ли это успешным, зависит от того, когда они будут прочитаны. IIRC malloc() читает их при первом вызове malloc() (это может быть очень рано из-за методов времени выполнения/+ загрузки Obj-C). Я не уверен, когда читаются NS *.

Если это все еще не работает, и вы счастливы работает в тренажере, я думаю вы можете использовать execve():

#include <unistd.h> 

int main (int argc, char ** argv, char ** envp) 
{ 
#ifdef DEBUGENVIRON 
    if (!getenv("NSDebugEnabled")) 
    { 
    setenv("NSDebugEnabled","1",1); 
    ... set the other variables ... 
    // Maybe this will complain about an autorelease pool. 
    char * executablePath = [[[NSBundle mainBundle] executablePath] filesystemRepresentation]; 
    execve(executablePath, argv, environ); abort(); 
    } 
#endif 
    ... do what you normally do in main() ... 
} 

Я довольно уверен, что execve (), системный вызов запрещен песочницей на устройстве.


Если все это слишком много, вот что я делаю:

Добавить некоторые переменные окружения в исполняемый файл. Снимите флажок. Когда требуется отладка, установите флажки. Когда отладка завершена, снимите флажок. Прежде чем совершать, убедитесь, что вы не совершаете ничего глупого в .xcodeproj.

Я не думаю, что вам нужен MallocStackLogging, если вы используете утечки (утечки должны установить его автоматически).

Вы также можете рассмотреть MallocPreScribble и MallocScribble.

+0

Привет, мне нравится последний вариант. Вы правы выше, это слишком много, это намного проще с точки зрения умственного манипулирования, чтобы просто снять эти поля. – Onedayitwillmake

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