2012-10-23 21 views
23

Oto moje dwie linie kodu:lldb błąd: zmienna niedostępne

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

umieścić punkt przerwy w drugiej linii, a kiedy nie, staram się go wydrukować:

(lldb) po frontFilePath 

Ale pojawia się następujący błąd:

error: variable not available 

Jestem zdezorientowany, ponieważ jeśli przekroczę wartość instrukcji NSLog, zmienna rzeczywiście drukuje do konsoli mi.

Co jest warte, próbuję debugować pierwszą linię od czasami zwraca NULL, ale nie mogę, od teraz, dowiedzieć się dlaczego.

+14

Wydaje mi się, że jest to po prostu część wysiłków Apple zmierzających do uczynienia Xcode coraz mniej użytecznym i użytecznym. – Suboptimus

Odpowiedz

40

Jest to artefakt polegający na debugowaniu zoptymalizowanego kodu. Gdy optymalizacja kompilatora jest włączona w ustawieniach kompilacji, przenosi zmienne między pamięcią a rejestrami, ponieważ decyduje o tym najlepiej. W momencie, w którym analizujesz zmienną w lldb, może ona w ogóle nie występować w rejestrach lub pamięci - mimo że wygląda na to, że powinna być nadal dostępna do wyświetlenia.

Możliwe, że jest to niedociągnięcie danych wyjściowych debugowania przez kompilator. Czasami kompilator będzie kopiował zmienną do rejestru dla jej użycia i tylko listę, która rejestruje lokalizację w informacji debugowania. Później rejestr zostaje ponownie wykorzystany do innych celów; wartość jest nadal obecna na stosie, ale kompilator nie powiedział debuggerowi, że można tam znaleźć wartość.

Jedynym sposobem, aby naprawdę stwierdzić, czy informacja o debugowaniu jest niewystarczająca, czy też rzeczywiście nie istnieje w danej instrukcji, jest ręczne sprawdzenie kodu zespołu. Po włączeniu optymalizacji za pomocą kompilatora kod źródłowy staje się słabym widokiem na to, co faktycznie jest wykonywane w dowolnej kolejności.

Zamiast wędrować zbyt daleko w zwariowany świat zoptymalizowanego debugowania kodu, zdecydowanie zalecam wyłączenie optymalizacji (Poziom optymalizacji w Ustawieniach kompilacji) dla twojej kompilacji i debugowanie jej w ten sposób, o ile to możliwe. Jeśli potrzebujesz debugowania swojej aplikacji za pomocą optymalizacji, upewnij się, że budujesz z najnowszym kompilatorem Apple LLVM obsługiwanym przez twój Xcode - zawsze jest praca nad ulepszeniem debugowania kodu i chcesz skorzystać z najbardziej potrzebnych na bieżąco narzędzia, które możesz.

+1

Przysięgam tylko po to, aby być jasnym - W mojej odpowiedzi odnalazłem szczegółowe informacje - co mówi lldb, że w tym konkretnym punkcie instrukcji nie wie, jak znaleźć wartość zmiennej. Zmienna może nie być dostępna w tym momencie lub informacje debugujące kompilator mogą być niewystarczająco opisowe, ale nie ma niczego, co może zrobić lldb w tym momencie, z czym ma pracować. –

+1

Dla tego, co jest warte, ustawienie budowania> Poziom optymalizacji został ustawiony na "none" w kategorii "debugowanie". Jest ustawiony na "najszybszy, najmniejszy" w kategorii "wydanie". Zakładam, że jestem w "debugowaniu", a nie "release", ale nie jestem do końca pewien, jak to powiedzieć. –

+2

Wpadłem na to, gdy w trybie Release zamiast debugowania, dziękuję za tę odpowiedź, pomogło mi to szybciej wykryć i powrócić :) – Luke

Powiązane problemy