การดีบัก Xcode - การแสดงภาพ


100

ฉันชอบใช้ดีบักเกอร์ Xcode คุณสามารถดูค่าของตัวแปรและเปลี่ยนแปลงได้

แต่ฉันสามารถแสดงภาพที่อ้างอิงโดยตัวแปรรูปภาพได้หรือไม่? ฉันรู้ว่าฉันสามารถเห็นไบต์ดิบของมันได้ แต่การแสดงหน้าต่างที่มีเนื้อหาเป็นมิตรกับมนุษย์มากกว่านี้

Xcode อาจไม่รองรับสิ่งนี้ อาจมีเครื่องมือภายนอกที่จะช่วยแสดงภาพ?

คำตอบ:


277

ใช้Quick Lookเพื่อตรวจสอบภาพใน Xcode debugger

เลือกNSImageหรือUIImageในตัวแก้ไขข้อบกพร่องจากนั้นคลิกไอคอน "ตา" ของ Quick Look

ไอคอน "ตา" ในแถบเครื่องมือดีบักเกอร์ Xcode

เช่นเดียวกับพื้นที่อื่น ๆ ของ OS X คุณสามารถใช้spacebarเพื่อ Quick Look!

การดู UIImage ใน Xcode debugger ผ่าน Quick Look

Quick Look ในดีบักเกอร์สามารถนำไปใช้กับคลาสของคุณเองได้:

การเปิดใช้งาน Quick Look สำหรับประเภทที่กำหนดเอง

คุณลักษณะ Quick Look ของตัวแปรในโปรแกรมดีบักเกอร์ Xcode ช่วยให้คุณได้รับการประเมินสถานะของตัวแปรออบเจ็กต์ด้วยภาพอย่างรวดเร็วผ่านการแสดงผลกราฟิกซึ่งแสดงในหน้าต่างป็อปโอเวอร์ทั้งในมุมมองตัวแปรดีบักเกอร์หรือในซอร์สโค้ดของคุณ

บทนี้อธิบายถึงวิธีที่คุณใช้เมธอด Quick Look สำหรับประเภทคลาสที่กำหนดเองของคุณเพื่อให้ตัวแปรออบเจ็กต์ของประเภทเหล่านั้นสามารถแสดงผลด้วยสายตาในหน้าต่างป๊อปโอเวอร์ Quick Look


14
ดีที่สุด. ลักษณะเฉพาะ. เคย!
Sev

2
นี่คือคำตอบที่เลอค่าที่สุดแห่งปี!
vedrano

9
อายุการเข้ารหัสใน Xcode และฉันไม่เคยรู้เกี่ยวกับคุณสมบัตินี้! นี่มันเจ๋งมาก!!! ขอบคุณมาก
Joan Cardona

2
รู้เกี่ยวกับคุณสมบัตินี้ แต่ขอบคุณสำหรับคำแนะนำของ Spacebar! ง่ายกว่าการคลิกด้วยเมาส์มาก :)
Chintan Patel

1
ทำงานร่วมกับ Xcode 10 และ Swift 4.2 อย่างมีเสน่ห์ ขอบคุณ.
atereshkov

16

แก้ไข:

ใน Xcode 5 ดีบักเกอร์สามารถแสดงการแสดงภาพของตัวแปร UIImage / CGImageRef!

Xcode เองก็ไม่สามารถทำได้ ฉันไม่รู้เกี่ยวกับเครื่องมือภายนอก

สิ่งที่ฉันกำลังทำเพื่อทดสอบภาพในขณะที่ดีบักคือการแปลงข้อมูลดิบนั้นเป็นรูปแบบไฟล์ภาพเช่น. png จากนั้นบันทึกไว้ที่ใดที่หนึ่งจากนั้นฉันจะเปิดภาพด้วยเครื่องมือดูภาพใด ๆ

ฉันมีรหัสชิ้นหนึ่งสำหรับจุดประสงค์นั้นซึ่งโดยพื้นฐานแล้วจะเป็นแบบนั้น:

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

และฉันแค่คัดลอกโค้ดนี้ไปวางในที่ที่ฉันต้องการดูเนื้อหาของรูปภาพในขณะวิ่ง

ตรวจสอบให้แน่ใจที่จะกำจัดของรหัสนี้โดยเร็วที่สุดเท่าที่เป็นไปได้เนื่องจากการสูงค่าใช้จ่ายของการเปลี่ยนแปลงของUIImageการNSData


2
แค่อยากรู้: ทำไมคุณถึงพูดว่า "(และไม่ควร) ทำ"? มีอยู่ครั้งหนึ่งที่ผู้คนกล่าวว่าคอมพิวเตอร์ "ไม่ควร" มีหน้าจอสีเนื่องจากมีราคาแพงเกินไปหรือโปรแกรมแก้ไขข้อความที่ใช้โดยโปรแกรมเมอร์ "ไม่ควร" ตรวจสอบโค้ดของคุณ เมื่อถึงจุดหนึ่งเราจำเป็นต้องก้าวต่อไปจากแนวความคิดโบราณใช่หรือไม่?
ไนซ์

โอเคฉันรับคืน "ไม่ควร" ฉันหวังว่าวันหนึ่ง IDE จะตีความรูปภาพในขณะที่แก้ไขจุดบกพร่อง
Avi Shukron

นี่เป็นความคิดที่ดีและช่วยฉันได้ - ขอบคุณ เห็นได้ชัดเมื่อมีคนชี้ให้เห็น แต่ก็ยังเป็นตัวชี้ที่ดี
Scott Little

@unsynchronized คุณจะดูว่า ... Xcode 5 สามารถแสดงภาพใน debugger ...
Avi Shukron

15

แก้ไขสำหรับ Xcode 5: เมื่อคุณวางเมาส์เหนือชื่อตัวแปรรูปภาพจะมีไอคอน "ตา" อยู่ทางด้านขวา เพียงคลิกเพื่อดูภาพปัจจุบัน!

หมายเหตุ: บางครั้งสิ่งนี้ล้มเหลวใน Xcode แม้ว่าภาพจะถูกต้องก็ตาม หากสิ่งนี้เกิดขึ้นหรือหากคุณไม่มีตัวแปร UIImage (เช่นเป็นคุณสมบัติของออบเจ็กต์อื่นคุณยังสามารถใช้คำตอบที่เก่ากว่าได้:

คำตอบที่เก่ากว่า: เริ่มจากคำตอบของ Avraham ฉันได้ลองทำการทดลองสองสามครั้งเพื่อแสดงภาพ iOS จาก lldb โดยไม่ต้องคอมไพล์ใหม่หรือเพิ่มลงในมุมมอง ในที่สุดฉันก็ได้พบกับ:

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

ฉันเก็บสตริงนี้ไว้ในโปรแกรมแก้ไขข้อความและวางเมื่อฉันต้องการ ซึ่งจะจัดเก็บรูปภาพปัจจุบันที่ฉันสนใจ (ในกรณีนี้คือ "myImage") เป็นไฟล์ PNG บนเดสก์ท็อป จากนั้นฉันก็สามารถเปิดไฟล์นี้ด้วย Preview

หากคุณกำลังทำงานบนอุปกรณ์ iOS คุณสามารถใช้

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

จากนั้นคุณสามารถใช้ Finder; เลือกอุปกรณ์ของคุณ "ไฟล์"; จากนั้นแอป dev ของคุณและคัดลอกรูปภาพไปยังเดสก์ท็อปเพื่อดู


+1000000 นี่คือทางออกที่ยอดเยี่ยม! ฉันต้องการเพิ่มว่าหากคุณกำลังแก้จุดบกพร่องบนอุปกรณ์คุณสามารถใช้บางอย่างเช่น iFunBox หรือ iExplorer เพื่อดึงภาพจากอุปกรณ์ได้
Quentin

คุณสามารถเขียนโดยตรงถึง "/ Users / <your username> /"; ด้วยวิธีนี้คุณจะไม่ต้องมองหาโฟลเดอร์ชั่วคราวของคุณผ่าน GUIDs
Dannie P

คำแนะนำที่ดี (โปรดทราบว่าคุณต้องใช้ / Users / <ชื่อผู้ใช้ของคุณ> / ใช้ไม่ได้กับ ~ /) อัปเดตคำแนะนำตามนั้น
mackworth

ข้อเสนอแนะที่ยอดเยี่ยม @mackworth ขอบคุณ.
arango_86

13

หากคุณต้องการทำงานกับคอนโซล lldb ให้ใช้คำสั่งchisel "visualize"

เคล็ดลับ:

หลังจากการติดตั้งคุณสามารถตั้งค่าเบรกพอยต์แบบมีเงื่อนไขหลังจากตั้งค่า UIImage ด้วยการดำเนินการ: "แสดงภาพ myUIImageToShowWithQuickLook"

ป้อนคำอธิบายภาพที่นี่

สิ่งนี้จะแสดงภาพให้คุณโดยอัตโนมัติเมื่อตัวแก้ไขจุดบกพร่องหยุดทำงาน


4

จะเกิดอะไรขึ้นถ้าคุณไม่สามารถเข้าถึงภาพผ่านมุมมองตัวแปรได้?

สะท้อนสิ่งที่ @pkamb กล่าว - คุณสามารถใช้มุมมองตัวแปรเพื่อดูภาพอย่างรวดเร็ว แต่ถ้าคุณไม่สามารถเข้าถึงภาพได้ล่ะ?

ตัวอย่างเช่นฉันมีภาพที่ (contentViewController.view.subviews[0].subviews[1] as? UIImageView).image

แต่ถ้าฉันพยายามขยายcontentViewControllerในมุมมองตัวแปรมันจะไม่เปิดเผยมุมมองย่อยของฉัน

ป้อนคำอธิบายภาพที่นี่

สิ่งที่คุณทำได้คือคลิกขวาเพิ่มนิพจน์จากนั้นคุณจะเห็นมัน!

ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่


จากนั้นคุณจะสามารถใช้คำสั่งเดียวกันกับด้านบน: po [UIImagePNGRepresentation ((contentViewController.view.subviews [0] .subviews [1] เป็น? UIImageView) .image) writeToFile: @ "/ Users / <userName> / เดสก์ท็อป /watchImage.png "atomically: NO];
mackworth


-8

คุณสามารถวางเบรกพอยต์ในบรรทัดของรูปภาพของคุณจากนั้นในดีบักเกอร์เพียงเขียน:

po your_UIImage_object

poย่อมาจากprint objectคำสั่ง GDB ซึ่งจะแสดงข้อมูลที่เป็นประโยชน์หลายอย่างเกี่ยวกับวัตถุที่ส่งผ่านในกรณีของคุณคือรูปภาพ


1
จริงๆแล้วการใช้ po กับวัตถุ UIImage โดยตรงจะพิมพ์ไปยังคอนโซลที่อยู่หน่วยความจำชื่อคลาสของอินสแตนซ์เท่านั้น สิ่งที่ชอบ: <UIImage: 0x7fc98df6c7d0>
Daniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.