Debugger Xcode nie drukuje obiektów i pokazuje zero, gdy tak nie jest

165

Xcode wyświetla błąd podczas próby drukowania obiektu za pomocą po <objectName>, ale tylko dla jednego projektu.

Zrzut ekranu

błąd: nie można zmaterializować struct: rozmiar zmiennej <varName> nie zgadza się z rozmiarem ValueObject Errored out in Execute, nie można wykonać PrepareToExecuteJITExpression

Debuger Xcode pokazuje również WSZYSTKIE obiekty jako nil( selfwykluczone), gdy nie są ( NSLogpokazuje poprawne dane wyjściowe, jak widać na obrazku). Nie wiem, co jest nie tak z projektem. Każdy inny projekt działa dobrze.

Masz pojęcie, co to może być? (Czyszczenie projektu nie przyniosło efektu.)

Binarian
źródło
Dla mnie brzmi to jak jakiś problem ze wskaźnikiem, ale jestem pewien, że będę szczery. Co próbujesz zrobić / osiągnąć?
user2967030
3
Błąd występuje na każdym obiekcie tego projektu. Nawet NSStringutworzono jedną linię powyżej punktu przerwania!
Binarian
1
Jak powiedziano w pytaniu, czyszczenie niczego nie zmienia; (ale dziękuję za próbę. Dodano komunikat o błędzie.
Binarian
3
Czy na pewno tworzysz bez optymalizacji? (-O0)
iccir
1
Optymalizacje można ustawić nie tylko w ustawieniach projektu, ale także w celach. Utknęło m :(
bazylia

Odpowiedzi:

269

Czy na pewno nie jesteś w „trybie wydania”?

Jeśli chcesz zobaczyć wartości zmiennych, musisz być w „trybie debugowania” (kliknij nazwę swojego projektu w lewym górnym rogu obok przycisków start / stop, następnie „Edytuj schemat ...”, potem ustawienia „Uruchom”, a następnie „ Info ", potem" Build Configuration ". Tutaj ustaw" Debug ". Jeśli było na" Release ", to jest to, że widziałeś wszystkie nils).

Mick
źródło
3
Mam tylko jedną konfigurację, jak zmienić konfigurację żeby była jak debug configuration?
Binarian
2
Ach ok, utworzyłem pusty projekt i teraz widzę wszystkie różnice w Build Settings, właściwość wdrożenia Strip debug symbols during copyzostała ustawiona na TAK.
Binarian
16
@ Alex1987 ustawić Strip debug symbols during copysię NOi Optimization Leveldo None -O0w projekcieBuild Settings
Binarian
32
Niestety, w pewnych sytuacjach lldb robił to w trybie debugowania, z wyłączonymi optymalizacjami i obecnymi symbolami debugowania. Czas odwiedzić bug
report.apple.com
4
Wystąpił ten sam problem - poziom optymalizacji to „Brak”. Problem polegał na tym, że Optymalizacja czasu łącza (LTO) była ustawiona na „Tak” również w trybie debugowania.
pi3
38

Ustawiłem „Poziom optymalizacji” dla konfiguracji debugowania na „Brak” i to rozwiązało problem.

Leszek Zarna
źródło
2
Zabawne, to nie zadziałało. Zrobiłem odwrotnie. Przerzuciłem się na Fastest, Smallest[-Os]i zadziałało.
Nate Hat
Wiele różnych sugestii, ale ta (ustawienie optymalizacji debugowania na Brak) naprawiła to za mnie.
Dejal
29

Upewnij się, że Address Sanitizer jest wyłączony w ustawieniach Schematu. Narzędzie Address Sanitizer nie działa dobrze z debugerem.

  1. Przejdź do Edit Scheme (Product >> Scheme >> Edit Scheme), wybierz Uruchom i przejdź do zakładki Diagnostyka.
  2. Upewnij się, że opcja „Enable Address Sanitizer” jest wyłączona.

wprowadź opis obrazu tutaj

KIO
źródło
4
To było dla mnie rozwiązanie. Najwyraźniej istnieje wiele powodów, dla których może się to zdarzyć.
manroe
16

Wygląda na to, że każdy ma swoje własne rozwiązanie.

Dla mnie używam Objective-Ci Swiftjednocześnie.

Przede wszystkim przejdź do TARGETS -> Build Settingsi przeszukajcode generation

Znajdziesz Apple LLVM 6.0 i Swift Compiler

Zmień ich Optimization Levelwszystko na None, a następnie Debuguj, możesz znaleźć wartość nienil

O dziwo, gdy zobaczysz wartość, rozwiązujesz ten problem na stałe, a następnie możesz zmienić Optimization Levelto, co było.

LeiHao
źródło
11

Może to nastąpić na inne sposoby. U mnie to dlatego, że wartość „Other C Flags” była ustawiona na „-O2”, nawet dla kompilacji debugowania. Wyłączenie tego dla kompilacji debugowania rozwiązało problem.

Thomas W.
źródło
9

Filtrowane wyjście debugowania

Dla mnie Xcode odfiltrowywał dane wyjściowe debugera. Upewnij się, że ustawienie wyjściowe to Wyjście debugera lub Wszystkie dane wyjściowe

Z zdziwieniem
źródło
6

Właśnie napotkałem ten problem i stwierdziłem, że jest to spowodowane Deployment Postprocessing = YESustawieniami kompilacji.

Zmiana tego, aby NOto naprawić, jak widać na poniższym zrzucie ekranu:

wprowadź opis obrazu tutaj

Wersja Xcode: 6.0.1 (6A317) na OSX 10.9.5

Łukasz
źródło
5

Po prostu napotykam podobny problem: w pewnym momencie debugger Xcode wydrukował niektóre typy obiektów, zwłaszcza NSStrings jako (null), chociaż zostały zainicjowane wartością. Wydrukowano za pośrednictwem

NSLog(@"String value: %@", myString);

została wyświetlona poprawna wartość obiektu.

Mylące! Rozwiązanie problemu było dość łatwe: po prostu wyłączyłem Xcode i ponownie uruchomiłem komputer. Po ponownym uruchomieniu Xcode wszystko znów działa dobrze :).

Torsten Barthel
źródło
5

Upewnij się, że Link-Time Optimization = Nojest włączony tryb debugowania w ustawieniach kompilacji.

llama591
źródło
Po prostu napotykam ten problem w Xcode 8 tylko na moich ustawieniach dynamicznej kompilacji frameworka! Dzięki
vmeyer
3
  1. Usuń dane pochodne
  2. Całkiem Xcode / Restart
  3. Czysty projekt

To wszystko, czego potrzebowałem.

TMin
źródło
2

Rozwiązania tutaj naprawią również błąd, który widzisz za error: <EXPR>:1:1: error: use of unresolved identifierkażdym razem, gdy próbujesz poużyć zmiennej.

Dla mnie rozwiązaniem było przejście do, Build Settingswyszukanie Optimization Leveli upewnienie się, że każde Debugustawienie jest ustawione na None.

Kevin Xu
źródło
To naprawiło to dla mnie. Masz jakiś pomysł, jakie są minusy wyłączenia tego ustawienia?
Jasper
1

Przejdź do „Inne flagi C” w ustawieniach kompilacji i ustaw wartość debugowania z -o2 na -O0

Shauket Sheikh
źródło
0

Ja też się z tym spotkałem i kiedy stwierdziłem, że jestem w trybie wydania, przełączam się na debugowanie ... bez poprawki. Okazuje się, że najpierw musiałem zrobić czysty (cmd + shift + k).

Więc myślę, że to, co się dzieje, to to, że po wbudowaniu w tryb wydania nie wszystko jest rekompilowane w develop, więc lldb nie może poprawnie odczytać symboli. Po wyczyszczeniu i ponownej kompilacji w programie Develop, zadziałało.

Spencer Hall
źródło
-3

W rzeczywistości system powinien działać od razu po wyjęciu z pudełka i nie działa z powodu linków do wielu różnych ustawień, do punktu, w którym wszystko może działać dla Ciebie lub nie.

Dlaczego system nie pozwala zawsze debugować w trybie debugowania, jest tajemnicą, na którą tylko Apple może odpowiedzieć (jeśli to obchodziło, co ostatnio wątpię).

W końcu różnicą między debugowaniem / brakiem debugowania byłyby dodatkowe tabele z metadanymi, które wypełniają tylko pamięć / miejsce na dysku.

Jeśli kompilujesz bezpośrednio na symulatorze lub urządzeniu, nie będziesz przejmować się tymi dodatkowymi megabajtami.

Musimy więc uruchomić dodatkowe pętle, aby zrobić bardzo podstawową i prostą rzecz, którą wszystkie Idy, które znam od ubiegłego wieku, działają dobrze.

I dla mnie to, co zadziałało, zmieniło się przy „Debugowaniu” optymalizacji czasu łącza z „Monolityczny” na „Nie” (xcode 8).

kindaian
źródło
Xcode = brak menedżera pakietów po wyjęciu z pudełka, autouzupełnianie i inne funkcje działają na woli, czasy kompilacji są ogromne itp.
zirinisp