Debugowanie Xcode - wyświetlanie obrazów

99

Uwielbiam używać debugera Xcode. Możesz spojrzeć na wartość zmiennej, a nawet ją zmienić.

Ale czy mogę w jakiś sposób WYŚWIETLIĆ obraz, do którego odwołuje się zmienna obrazu? Wiem, że widzę jego surowe bajty, ale wyświetlenie okna z jego zawartością byłoby znacznie bardziej przyjazne dla człowieka.

Xcode może tego nie obsługiwać. Może jest jakieś zewnętrzne narzędzie, które pomogłoby w wyświetlaniu obrazów?

krasnyk
źródło

Odpowiedzi:

273

Użyj Quick Look, aby sprawdzić obrazy w debugerze Xcode.

Wybierz NSImagelub UIImagew debugerze, a następnie kliknij ikonę „oka” Quick Look.

ikona „oka” na pasku narzędzi debugera Xcode

Podobnie jak inne obszary OS X, możesz również użyć spacebarQuick Look!

Wyświetlanie UIImage w debugerze Xcode za pośrednictwem Quick Look

Quick Look w debugerze można również zaimplementować dla własnych klas:

Włączanie szybkiego wyszukiwania typów niestandardowych

Funkcja szybkiego podglądu zmiennych w debugerze Xcode umożliwia uzyskanie szybkiej wizualnej oceny stanu zmiennej obiektu poprzez renderowanie graficzne, wyświetlane w wyskakującym oknie w widoku zmiennych debugera lub w kodzie źródłowym.

W tym rozdziale opisano sposób implementacji metody Quick Look dla niestandardowych typów klas, aby zmienne obiektowe tych typów mogły być również renderowane wizualnie w wyskakującym oknie Quick Look.

pkamb
źródło
13
Najlepsza. Funkcja. Zawsze!
Sev
2
To najcenniejsza odpowiedź roku!
vedrano
8
Wieki kodują w Xcode i nigdy nie wiedziałem o tej funkcji! To jest niesamowite!!! Wielkie dzięki
Joan Cardona
2
Wiedziałem o tej funkcji, ale dzięki za wskazówkę dotyczącą spacji! O wiele łatwiejsze niż klikanie w oko myszą. :)
Chintan Patel
1
Pracuj z Xcode 10 i Swift 4.2 jak marzenie. Dzięki.
atereshkov
16

EDYTOWAĆ:

Począwszy od Xcode 5, debugger może pokazać wizualną reprezentację zmiennych UIImage / CGImageRef!

Sam Xcode nie może tego zrobić. Nie wiem o narzędziach zewnętrznych.

To, co robię, aby testować obrazy podczas debugowania, to konwertować te surowe dane do formatu pliku obrazu, takiego jak .png, a następnie zapisywać go gdzieś, a następnie otwieram obraz za pomocą dowolnego narzędzia do przeglądania obrazów.

Mam do tego fragment kodu, który zasadniczo wygląda tak:

NSData *imageData = UIImagePNGRepresentation(self.myUIImage);
[imageData writeToURL:desktopURL atomically:YES];

I właśnie kopiuję i wklejam ten kod, gdzie chcę zobaczyć zawartość obrazu w biegu.

Pamiętaj, aby jak najszybciej pozbyć się tego kodu ze względu na wysoki koszt konwersji UIImagedoNSData

Avi Shukron
źródło
2
po prostu ciekawy: dlaczego mówisz „(i nie powinieneś) tego robić”? kiedyś ludzie mówili, że komputery „nie powinny” mieć kolorowych ekranów, ponieważ są zbyt drogie, lub że edytor tekstu używany przez programistów „nie powinien” sprawdzać składni kodu. w którymś momencie na pewno musimy odejść od archaicznych pomysłów?
niezsynchronizowany
Ok, więc cofam „nie powinienem”. Chciałbym, żeby IDE pewnego dnia zinterpretowało obrazy podczas debugowania.
Avi Shukron
To świetny pomysł i właśnie mi pomógł - dzięki. Niby oczywiste, gdy ktoś to wskazał, ale wciąż świetny wskaźnik.
Scott Little,
@ Niezsynchronizowane, czy spojrzysz na to ... Xcode 5 może wyświetlać obrazy w debugerze ...
Avi Shukron
14

Edycja dla Xcode 5: Teraz, gdy najedziesz kursorem na nazwę zmiennej obrazu, po prawej stronie pojawi się ikona „oka”. Po prostu kliknij, aby zobaczyć aktualny obraz!

UWAGA: czasami kończy się to niepowodzeniem w Xcode, nawet jeśli obraz jest poprawny. Jeśli tak się stanie, LUB jeśli nie masz zmiennej UIImage (np. Jest to właściwość innego obiektu, nadal możesz użyć starszej odpowiedzi:

Starsza odpowiedź: Zaczynając od odpowiedzi Abrahama, wypróbowałem kilka eksperymentów dotyczących wyświetlania obrazu iOS z lldb bez konieczności ponownej kompilacji lub dodawania go do widoku. W końcu wymyśliłem:

e [UIImagePNGRepresentation(myImage) writeToFile:@"/Users/<userName>/Desktop/myImage.png" atomically:NO];

Trzymam ten ciąg w edytorze tekstu i wklejam go, gdy jest potrzebny. Spowoduje to zapisanie interesującego mnie bieżącego obrazu (w tym przypadku „myImage”) do pliku PNG na pulpicie. Następnie mogę po prostu otworzyć ten plik za pomocą podglądu.

Jeśli pracujesz na urządzeniu z systemem iOS, możesz użyć

 e [UIImagePNGRepresentation(myImage) writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingString:@"/myImage.png"] atomically:NO];

Następnie możesz użyć Findera; Wybierz swoje urządzenie; "Pliki"; następnie aplikację deweloperską i skopiuj obraz na pulpit, aby go wyświetlić.

mackworth
źródło
+1000000 To niesamowite rozwiązanie! Chciałbym dodać, że jeśli debugujesz na urządzeniu, możesz użyć czegoś takiego jak iFunBox lub iExplorer, aby pobrać obraz z urządzenia.
Quentin,
Możesz nawet pisać bezpośrednio do „/ Users / <twoja nazwa użytkownika> /”; w ten sposób nie będziesz musiał szukać folderu tymczasowego za pomocą identyfikatorów GUID
Dannie P,
Dobra sugestia (pamiętaj, że musisz użyć / Users / <twoja nazwa użytkownika> /, nie działa z ~ /). Odpowiednio zaktualizowałem sugestię.
mackworth
Niesamowita sugestia @mackworth. Dzięki.
arango_86
13

Jeśli lubisz pracować z konsolą lldb, użyj polecenia dłuta "wizualizuj"

Wskazówka:

po instalacji możesz ustawić warunkowy punkt przerwania po ustawieniu UIImage za pomocą akcji: "visualize myUIImageToShowWithQuickLook"

wprowadź opis obrazu tutaj

spowoduje to automatyczne wyświetlenie obrazu po zatrzymaniu debugera.

Zaster
źródło
4

A jeśli nie możesz dostać się do obrazu za pomocą widoku zmiennych?

Powtarzając to, co powiedział @pkamb - możesz użyć widoku zmiennych, aby szybko spojrzeć na obraz. Ale co, jeśli nie możesz dostać się do obrazu?

na przykład mam obraz w (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

ale jeśli spróbuję rozwinąć contentViewControllerw widoku zmiennej, nie ujawnia moich podwidoków

wprowadź opis obrazu tutaj

co możesz zrobić, to kliknąć prawym przyciskiem myszy, dodać wyrażenie i wtedy możesz je zobaczyć!

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wyu
źródło
Wtedy powinieneś być w stanie użyć tego samego polecenia co powyżej: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] as? UIImageView) .image) writeToFile: @ "/ Users / <userName> / Desktop /watchImage.png "atomowo: NIE];
mackworth
-7

Możesz umieścić punkt przerwania w wierszu obrazu, a następnie w debugerze po prostu napisz:

po your_UIImage_object

pooznacza print object, jest to polecenie GDB, które wyświetli kilka przydatnych informacji o przekazanym obiekcie, w twoim przypadku o obrazie.

Malloc
źródło
1
Właściwie użycie po bezpośrednio z obiektem UIImage spowoduje wydrukowanie na konsoli tylko adresu pamięci nazwy klasy instancji. Coś w rodzaju: <UIImage: 0x7fc98df6c7d0>
Daniel