Błąd lldb: zmienna niedostępna


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

W drugiej linii wstawiam punkt przerwania i jeśli taki jest, to próbuję go wydrukować:
(lldb) po frontFilePath

Ale pojawia się następujący błąd:
error: variable not available

Jestem zdezorientowany, ponieważ jeśli przekroczę instrukcję NSLog, zmienna jest w rzeczywistości wypisywana na konsoli.
W każdym razie od tego czasu próbuję debugować pierwszą linię

czasami

zwraca NULL, chociaż w tej chwili nie mogę dowiedzieć się, dlaczego.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest to artefakt debugowania zoptymalizowanego kodu. Gdy optymalizacja kompilatora jest włączona w ustawieniach kompilacji, przenosi zmienne między pamięcią i rejestrami według własnego uznania. W chwili, gdy sprawdzasz zmienną w lldb, może ona w ogóle nie istnieć w rejestrach lub pamięci - nawet jeśli wydaje się, że nadal powinna być dostępna do wyświetlenia.
Być może jest to brak informacji debugowania przez kompilator. Czasami kompilator kopiuje zmienną do rejestru w celu użycia i podaje tylko lokalizację tego rejestru w informacjach debugowania. Później rejestr jest ponownie profilowany do innych celów; wartość nadal znajduje się na stosie, ale kompilator nie poinformował debugera, że ​​można tam znaleźć wartość.
Jedynym sposobem, aby naprawdę stwierdzić, czy są to niewystarczające informacje debugowania lub czy wartość tak naprawdę nie istnieje w tej konkretnej instrukcji, to ręczne sprawdzenie kodu asemblera. Gdy włączysz optymalizację wspomaganą przez kompilator, kod źródłowy staje się słabym wyobrażeniem o tym, co jest faktycznie wykonywane w określonej kolejności.
Zamiast wędrować zbyt daleko w zwariowanym świecie zoptymalizowanego debugowania kodu, zdecydowanie zalecam wyłączenie optymalizacji (poziom optymalizacji w ustawieniach kompilacji) dla kompilacji i debugowanie w ten sposób, jeśli to w ogóle możliwe. Jeśli naprawdę potrzebujesz debugowania aplikacji poprzez optymalizację, upewnij się, że tworzysz ją za pomocą najnowszego kompilatora Apple LLVM obsługiwanego przez Xcode - zawsze jest do zrobienia, aby ulepszyć zoptymalizowane debugowanie kodu i chcesz wykorzystać jak najwięcej aktualne narzędzia, które możesz.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Swift, prawdopodobnie zaczynającym się w Xcode 9 i nadal problemem w Xcode 10, może to wystąpić nawet wtedy, gdy optymalizacja kodu jest wyłączona w ustawieniach kompilacji. Jak zauważył @carlos_ms, tymczasowym rozwiązaniem jest zdefiniowanie zmiennej jako mutable, tj.
Skręcać
let foo = Bar().string

w
var foo = Bar().string

w celu wymuszenia optymalizacji pominięcia tej zmiennej. Należy pamiętać, że może to nie działać we wszystkich przypadkach.
Stara, dobra
debugPrint ()
może Ci w tym pomóc.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wydaje się, że „Address Sanitizer” w diagnostyce również sprawia, że ​​wartości zmiennych są niedostępne.
Schematy & > Start & > Diagnostyka & > Adres środka dezynfekującego
https://i.stack.imgur.com/Np6uI.png
Budynków

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się