Debugging Xcode - menampilkan gambar

100

Saya suka menggunakan debugger Xcode. Anda dapat melihat nilai variabel dan bahkan mengubahnya.

Tapi bisakah saya menampilkan gambar yang direferensikan oleh variabel gambar? Saya tahu saya dapat melihat byte mentahnya, tetapi akan jauh lebih ramah manusia untuk menampilkan jendela dengan isinya.

Xcode mungkin tidak mendukung ini. Mungkin ada alat eksternal yang akan membantu menampilkan gambar?

Krasnyk
sumber

Jawaban:

273

Gunakan Tampilan Cepat untuk memeriksa gambar di debugger Xcode.

Pilih salah satu NSImageatau UIImagedi debugger, lalu klik ikon "mata" Lihat Cepat.

ikon "mata" di bilah alat debugger Xcode

Seperti area OS X lainnya, Anda juga dapat menggunakan spacebarQuick Look!

Melihat gambar UII di debugger Xcode melalui Lihat Cepat

Quick Look di debugger juga dapat diterapkan untuk kelas Anda sendiri:

Mengaktifkan Pencarian Cepat untuk Jenis Kustom

Fitur Tampilan Cepat variabel di debugger Xcode memungkinkan Anda memperoleh penilaian visual cepat dari status variabel objek melalui rendering grafis, yang ditampilkan di jendela munculan baik dalam tampilan variabel debugger atau di tempatkan di kode sumber Anda.

Bab ini menjelaskan bagaimana Anda mengimplementasikan metode Quick Look untuk tipe kelas kustom Anda sehingga variabel objek dari tipe tersebut juga bisa ditampilkan secara visual di jendela popover Quick Look.

pkamb
sumber
13
Terbaik. Fitur. Pernah!
Sev
2
Ini adalah jawaban paling berharga tahun ini!
vedrano
8
Usia coding di Xcode dan saya tidak pernah tahu tentang fitur ini! Ini luar biasa !!! Terima kasih banyak
Joan Cardona
2
Tahu tentang fitur ini, tetapi terima kasih atas tip bilah spasi! Jauh lebih mudah daripada mengklik mata dengan mouse. :)
Chintan Patel
1
Bekerja dengan Xcode 10 dan Swift 4.2 seperti pesona. Terima kasih.
atereshkov
16

EDIT:

Pada Xcode 5, debugger dapat menunjukkan representasi visual variabel UIImage / CGImageRef!

Xcode sendiri tidak dapat melakukannya. Saya tidak tahu tentang alat eksternal.

Apa yang saya lakukan untuk menguji gambar saat debugging adalah mengubah data mentah itu menjadi format file gambar, seperti .png, dan kemudian menyimpannya di suatu tempat, dan kemudian saya membuka gambar dengan alat penampil gambar.

Saya memiliki sepotong kode untuk tujuan itu, yang pada dasarnya terlihat seperti itu:

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

Dan saya hanya menyalin-tempel kode ini di mana saya ingin melihat konten gambar yang sedang dijalankan.

Pastikan untuk menghapus kode ini secepat mungkin karena mahalnya biaya konversi UIImagekeNSData

Avi Shukron
sumber
2
hanya ingin tahu: mengapa Anda mengatakan "(dan tidak seharusnya) melakukannya"? Ada suatu masa ketika orang berkata bahwa komputer "seharusnya" memiliki layar berwarna, karena harganya terlalu mahal, atau editor teks yang digunakan oleh pemrogram "tidak boleh" memeriksa sintaks kode Anda. pada titik tertentu kita perlu beralih dari ide-ide kuno, bukan?
tidak tersinkronisasi
Oke, jadi saya mengambil "tidak boleh" kembali. Saya berharap suatu hari nanti IDE akan menafsirkan gambar saat melakukan debug.
Avi Shukron
Ini adalah ide yang bagus dan membantu saya - terima kasih. Agak jelas setelah seseorang menunjukkannya, tetapi masih merupakan penunjuk yang bagus.
Scott Little
@unsynchronized akan Anda lihat itu ... Xcode 5 dapat menampilkan gambar di debugger ...
Avi Shukron
14

Edit untuk Xcode 5: Sekarang saat Anda mengarahkan kursor ke nama variabel gambar, ada ikon "mata" di sebelah kanan. Cukup klik untuk melihat gambar saat ini!

CATATAN: terkadang ini gagal di Xcode, bahkan jika gambarnya benar. Jika ini terjadi, ATAU jika Anda tidak memiliki variabel UIImage (misalnya, properti dari objek lain, Anda masih dapat menggunakan jawaban yang lebih lama:

Jawaban yang lebih lama: Dimulai dengan jawaban Avraham, saya mencoba beberapa eksperimen untuk menampilkan gambar iOS dari lldb tanpa harus mengkompilasi ulang atau menambahkannya ke tampilan. Saya akhirnya menemukan:

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

Saya menyimpan string ini di editor teks dan menempelkannya saat saya membutuhkannya. Ini menyimpan gambar saat ini yang saya minati (dalam hal ini, "myImage") ke file PNG di Desktop. Lalu saya bisa membuka file ini dengan Preview.

Jika Anda bekerja pada perangkat iOS, maka Anda dapat menggunakan

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

Kemudian Anda dapat menggunakan Finder; pilih perangkat Anda; "File"; lalu aplikasi dev Anda, dan salin gambar ke Desktop Anda untuk melihatnya.

mackworth
sumber
+1000000 Ini adalah solusi yang luar biasa! Saya ingin menambahkan bahwa jika Anda melakukan debug pada perangkat, Anda dapat menggunakan sesuatu seperti iFunBox atau iExplorer untuk mengambil gambar dari perangkat.
Quentin
Anda bahkan dapat menulis langsung ke "/ Users / <your username> /"; dengan cara ini Anda tidak perlu mencari folder temp Anda melalui GUIDs
Dannie P
Saran yang bagus (perhatikan bahwa Anda harus menggunakan / Users / <your username> /, ini tidak berfungsi dengan ~ /). Memperbarui saran yang sesuai.
mackworth
Saran luar biasa @mackworth. Terima kasih.
arango_86
13

Jika Anda ingin bekerja dengan konsol lldb, gunakan perintah chisel "visualize"

tip:

setelah penginstalan, Anda dapat menyetel breakpoint bersyarat setelah menyetel UIImage dengan tindakan: "visualize myUIImageToShowWithQuickLook"

masukkan deskripsi gambar di sini

ini akan menampilkan gambar secara otomatis saat debugger berhenti.

Zaster
sumber
4

Bagaimana jika Anda tidak bisa mendapatkan gambar melalui tampilan variabel?

Menggemakan apa yang dikatakan @pkamb - Anda dapat menggunakan tampilan variabel untuk melihat gambar dengan cepat. Tetapi bagaimana jika Anda tidak bisa mendapatkan gambarnya?

misalnya saya memiliki gambar di (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

tetapi jika saya mencoba untuk memperluas contentViewControllerdalam tampilan variabel itu tidak mengekspos subview saya

masukkan deskripsi gambar di sini

yang dapat Anda lakukan adalah klik kanan, tambahkan ekspresi, dan Anda dapat melihatnya!

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

wyu
sumber
Maka Anda harus dapat menggunakan perintah yang sama seperti di atas: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] as? UIImageView) .image) writeToFile: @ "/ Users / <userName> / Desktop /watchImage.png "secara atomically: NO];
mackworth
-7

Anda dapat meletakkan breakpoint di baris gambar Anda, lalu di debugger, cukup tulis:

po your_UIImage_object

posingkatan print object, itu adalah perintah GDB yang akan menampilkan beberapa informasi berguna tentang objek yang dilewatkan, dalam kasus Anda gambarnya.

Malloc
sumber
1
Sebenarnya menggunakan po dengan objek UIImage secara langsung hanya akan mencetak ke konsol alamat memori nama kelas instance. Sesuatu seperti: <UIImage: 0x7fc98df6c7d0>
Daniel