Подтвердить что ты не робот

Lldb error: переменная недоступна

Вот мои две строки кода:

NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );

Я поставил точку останова на вторую строку, и когда я попытаюсь ее распечатать,

(lldb) po frontFilePath

Но я получаю следующую ошибку:

error: variable not available

Я запутался, потому что, если я перехожу на инструкцию NSLog, переменная действительно печатает на консоли.

Для чего это стоит, я пытаюсь отлаживать первую строку, так как иногда она возвращает NULL, а я не могу, на данный момент, выяснить, почему.

4b9b3361

Ответ 1

Это артефакт отладки оптимизированного кода. Когда оптимизация компилятора включена в ваших настройках сборки, она перемещает переменные между памятью и регистрами, как она решает лучше всего. В тот момент, когда вы изучаете переменную в lldb, она может отсутствовать в регистрах или в памяти вообще - хотя она выглядит так, будто она все еще доступна для отображения.

Возможно, это недостаток отладочной информации, выводимой компилятором. Иногда компилятор копирует переменную в регистр для ее использования и только перечисляет это место регистрации в отладочной информации. Позже регистр перераспределяется для других целей; значение все еще присутствует в стеке, но компилятор не сказал отладчику, что это значение можно найти там.

Единственный способ действительно определить, недостаточно ли он отладочная информация или если значение действительно не существует в этой конкретной инструкции, - это проверить код сборки вручную. Как только вы включаете оптимизацию с компилятором, исходный код становится слабым представлением о том, что фактически выполняется в любом конкретном порядке.

Вместо того, чтобы слишком далеко перемещаться в сумасшедший мир оптимизированной отладки кода, я настоятельно рекомендую отключить оптимизацию (уровень оптимизации в настройках сборки) для вашей сборки и отлаживать ее таким образом, если это вообще возможно. Если вам нужно отлаживать приложение с оптимизацией, убедитесь, что вы создаете последний компилятор Apple LLVM, поддерживаемый вашим Xcode, - всегда выполняется работа по оптимизации оптимизированной отладки кода, и вы хотите воспользоваться наиболее доступных на сегодняшний день.