Условные переменные среды в Xcode - PullRequest
0 голосов
/ 28 сентября 2010

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

  NSDebugEnabled
  NSZombieEnabled
  MallocStackLogging
  MallocStackLoggingNoCompact

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


1 Ответ

0 голосов
/ 29 сентября 2010

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

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

Если подстановка переменной не работает, вы могли бы быть в состоянии вызвать setenv ()/ putenv () в самом начале функции main () (до выделения пула автоматического выпуска) для изменения среды перед считыванием переменных;Успешно ли это зависит от того, когда они прочитаны.IIRC malloc () читает их в первый раз, когда вы вызываете malloc () (это может быть очень рано из-за методов выполнения Obj-C / + load).Я не уверен, когда будут прочитаны 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, если вы используете Leaks (Leaks должен установить его автоматически).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...