Как взломать на __NSAutoreleaseNoPool - PullRequest
10 голосов
/ 16 мая 2010

Я попал с

*** __NSAutoreleaseNoPool (): объект 0x1961180 класса NSEvent автоматически освобожден без пула на месте - просто утечка

предупреждений во времяво время выполнения и понятия не имею, в чем причина.Cursory Googles указывают, что это символ, который я могу разбить с помощью Xcode, но добавление его в качестве символической точки останова через Run> Manage Breakpoints> Add Symbolic Breakpoint или просто через окно управления точками останова приводит к точке останова с - рядом с нимвместо проверки, которая, как я понимаю, означает, что это символ, который не может быть найден.

Я попытался добавить символ "__NSAutoreleaseNoPool" с двумя подчеркиваниями, одно подчеркивание, и теперь я просто чувствуюглупый.Ошибки продолжают регистрироваться, и никакие точки останова не попадают.Любые указатели для взлома символов Obj-C или отладки этого приветствуются.

[РЕДАКТИРОВАТЬ: после, может быть, 10 (еще 10, так что всего пара дюжин, включая как минимум два перезапуска Xcode) я получил "В ожидании"точка останова 9 - "__NSAutoreleaseNoPool" разрешен "напечатано на моей консоли, и точка останова начала работать.Есть ли способ принудительно разрешить ожидающую точку останова?]

Ответы [ 5 ]

25 голосов
/ 29 марта 2011

Чтобы действительно ответить на ваш вопрос, посмотрите NSDebug.h. Там вы найдете комментарий, частью которого является:

NAME OF ENV. VARIABLE                  DEFAULT  SET TO...
NSDebugEnabled                            NO    "YES"
NSZombieEnabled                           NO    "YES"
NSDeallocateZombies                       NO    "YES"
NSHangOnUncaughtException                 NO    "YES"

и далее эти комментарии:

// Functions used as interesting breakpoints in a debugger
// void __NSAutoreleaseNoPool(void *object);
        // Called to log the "Object X of class Y autoreleased with no
        // pool in place - just leaking" message.  If an environment
        // variable named "NSAutoreleaseHaltOnNoPool" is set with string
        // value "YES", the function will automatically break in the
        // debugger (or terminate the process).

// void __NSAutoreleaseFreedObject(void *freedObject);
        // Called when a previously freed object would be released
        // by an autorelease pool.  If an environment variable named
        // "NSAutoreleaseHaltOnFreedObject" is set with string value
        // "YES", the function will automatically break in the debugger
        // (or terminate the process).

Так что вам не нужно устанавливать эти точки останова; просто установите соответствующие переменные среды. Вы можете сделать последнее либо из вашего, например. .bashrc или в Xcode 4 вы можете отредактировать раздел «Выполнить» вашей «схемы» и установить их там - это то, что я делаю, и это работает просто отлично.

5 голосов
/ 21 марта 2011

У меня такая же проблема при установке точки останова на __NSAutoreleaseNoPool (). Наконец, я успешно установил точку останова с помощью команды gdb. После запуска отладчика нажмите Ctrl + C в консоли отладчика. Используйте «br __NSAutoreleaseNoPool», чтобы установить точку останова и перезапустить отладчик.

2 голосов
/ 17 мая 2010

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

1 голос
/ 16 мая 2010

Проблема здесь проста: вы выпускаете без пула на месте. Это обычно происходит в инструментах командной строки, написанных против Foundation. Просто добавьте следующий код к вашему main(): (несущественные части пропущены)

int main (…) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  /// Your code goes here.

  [pool drain]; // This one might not strictly speaking be neccessary.
  [pool release];

   return 0;
}

Редактировать: Если вы не создаете инструмент командной строки, скорее всего, вы делаете что-то непослушное; но тем не менее: если у вас есть код, который вы вызываете до NSApplicationMain(), вам нужно обернуть его в тот же базовый код, опустошив и освободив пул до вызова NSApplicationMain.

0 голосов
/ 17 мая 2013

Я знаю, что это старая тема. Просто хотел поделиться некоторыми взглядами на правильное решение. Правильный способ иметь точку останова в _autoreleasenopool - использовать навигатор точек останова в xcode (используйте команду + 6). В левой нижней части навигатора точки останова нажмите знак «+» и добавьте символическую точку прерывания. Введите символ как objc_autoreleaseNoPool.

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