Xcode Debugger: ดูค่าของตัวแปร


107

รหัสของฉันใน UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

ฉันจะดูค่าของdelegate.myDataหรือindexPath.rowใน Debugger ได้อย่างไร delegate.myDataควรเป็นอาร์เรย์และ ฉันเท่านั้นที่สามารถดูที่อยู่ในหน่วยความจำของวัตถุและแต่อยู่ที่ไหนและ?indexPath.rowintdelegateindexPathmyDatarow

ข้อความแสดงแทน

คำตอบ:


142

ตรวจสอบวิธีการดูเนื้อหาของตัวแปร NSDictionary ในโปรแกรมดีบักเกอร์ Xcode

ฉันยังใช้

po variableName
print variableName

ในคอนโซล

ในกรณีของคุณเป็นไปได้ที่จะดำเนินการ

print [myData objectAtIndex:indexPath.row]  

หรือ

po [myData objectAtIndex:indexPath.row]

ขอบคุณ! ฉันพยายามมาก: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... แต่ทุกครั้งที่ฉัน ได้รับข้อความ "ไม่มีสมาชิกชื่อแถว" สิ่งนี้ใช้ได้: "พิมพ์ indexPath" และ "po indexPath" ฉันเลยลองใช้ "[]" แทนเป็น ".": "po [indexPath row]" -> "ไม่สามารถพิมพ์คำอธิบายของวัตถุ NIL" "po [indexPath getRow]" -> "เป้าหมายไม่ตอบสนองต่อตัวเลือกข้อความนี้" :-(
Manni

4
ลองพิมพ์ (int) [แถว indexPath]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran ฉันค่อนข้างมั่นใจว่าเทียบเท่ากับpo objในpo print(obj)สวิฟต์
คริส

นี่เหมาะสำหรับการค้นหาค่าคุณสมบัติที่คำนวณด้วยเช่นกัน ขอบคุณ!
Paula Hasstenteufel

26

ฉันเห็นด้วยกับผู้โพสต์อื่น ๆ ว่า Xcode ในฐานะสภาพแวดล้อมที่กำลังพัฒนาควรมีวิธีง่ายๆในการดีบักตัวแปร ข่าวดีมีอยู่!

หลังจากค้นหาและไม่พบคำตอบ / บทช่วยสอนง่ายๆเกี่ยวกับวิธีการดีบักตัวแปรใน Xcode ฉันไปสำรวจด้วย Xcode และพบว่าสิ่งนี้ (อย่างน้อยสำหรับฉัน) การค้นพบที่มีประโยชน์มาก

วิธีแก้จุดบกพร่องตัวแปรของคุณอย่างง่ายดายใน Xcode 4.6.3

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

ปุ่ม Debug Area

พื้นที่ดีบักใน Xcode 4.6.3

ตั้งค่าเบรกพอยต์ - บรรทัดในโค้ดของคุณที่คุณต้องการให้โปรแกรมของคุณหยุดชั่วคราวโดยคลิกที่ขอบของพื้นที่โค้ดของคุณ

เบรกพอยต์

ตอนนี้ในพื้นที่ดีบักให้มองหาปุ่มนี้แล้วคลิกปุ่มตรงกลาง คุณจะสังเกตเห็นว่าพื้นที่ของคุณถูกแบ่งออกเป็นสองส่วน

แยกพื้นที่ดีบัก

ควรมีลักษณะดังนี้

ตอนนี้เรียกใช้แอปพลิเคชันของคุณ

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

ช่องค้นหา

คุณสามารถขยายลูกศรซ้ายบนตัวแปรเพื่อดูรายละเอียดเพิ่มเติม และแม้กระทั่งใช้ช่องค้นหาเพื่อแยกตัวแปรที่คุณต้องการและเห็นว่ามันเปลี่ยนแปลงตามเวลาจริงเมื่อคุณ "ก้าวเข้าสู่" ขอบเขตของเบรกพอยต์

ก้าวเข้าสู่

ทางด้านขวาของพื้นที่ดีบักคุณสามารถส่งเพื่อพิมพ์ตัวแปรตามที่คุณต้องการโดยใช้ปุ่มขวาของเมาส์คลิกบนตัวแปรที่ต้องการ

เมนูตามบริบท

อย่างที่คุณเห็นเมนูตามบริบทนั้นเต็มไปด้วยตัวเลือกการดีบักที่น่าสนใจมาก เช่นWatchที่แนะนำไปแล้วด้วยคำสั่งที่พิมพ์หรือแม้แต่Edit Value …ที่เปลี่ยนค่ารันไทม์ของตัวแปรของคุณ!


21

นอกจากนี้คุณสามารถ:

  1. ตั้งเบรกพอยต์เพื่อหยุดการทำงานชั่วคราว
  2. วัตถุต้องอยู่ในขอบเขตการดำเนินการ
  3. เลื่อนตัวชี้เมาส์ไปที่วัตถุหรือตัวแปร
  4. คำแนะนำเครื่องมือสีเหลืองจะปรากฏขึ้น
  5. เลื่อนเมาส์ไปที่คำแนะนำเครื่องมือ
  6. คลิกที่ลูกศรเล็ก ๆ สองลูกที่ชี้ขึ้นและลง
  7. เมนูบริบทจะปรากฏขึ้น
  8. เลือก "พิมพ์คำอธิบาย" มันจะดำเนินการ [คำอธิบายวัตถุ]
  9. คำอธิบายจะปรากฏในเอาต์พุตของคอนโซล

IMHO ซ่อนและยุ่งยากเล็กน้อย ...


ใน xcode ของฉัน "Print Description" ไม่ทำงานฉันจะเปิดใช้งานได้อย่างไร?
Kirtikumar A.

@kirtiavaiya แอปพลิเคชันจะต้องหยุดชั่วคราวและตัวแปรของคุณจะต้องอยู่ในขอบเขตปัจจุบันจึงจะพิมพ์ได้ นอกจากนี้คุณไม่สามารถพิมพ์ "self.variable" ได้โดยตรง แต่คุณสามารถใช้โซลูชัน Andriy สำหรับการพิมพ์ _ <ชื่อตัวแปร> ตัวอย่างเช่น: สำหรับ self.btn สวัสดีเขียนในคอนโซล "po _btnHello" (ใช้ได้เฉพาะเมื่อคุณไม่ได้เปลี่ยนชื่อเมธอด getter)
LightMan

@LightMan ใช่มันเป็นอย่างที่คุณพูด แต่มันก็ไม่ทำงาน
Kirtikumar A.

10

ความสับสนของคุณเกิดจากการที่คุณสมบัติที่ประกาศไม่ได้ (จำเป็นต้องตั้งชื่อให้เหมือนกับตัวแปร) (อินสแตนซ์)

expresion

indexPath.row

เทียบเท่ากับ

[indexPath row]

และงานที่ได้รับมอบหมาย

delegate.myData = [myData objectAtIndex:indexPath.row];

เทียบเท่ากับ

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

การตั้งชื่อมาตรฐานสำหรับคุณสมบัติสังเคราะห์

นอกจากนี้delegateอาจมีการประกาศว่าเป็นประเภทid<SomeProtocol>กล่าวคือคอมไพเลอร์ไม่สามารถให้ข้อมูลประเภทที่แท้จริงได้delegateณ จุดนั้นและดีบักเกอร์อาศัยข้อมูลที่ให้ไว้ในเวลาคอมไพล์ เนื่องจากidเป็นประเภททั่วไปจึงไม่มีข้อมูลเวลาคอมไพล์เกี่ยวกับตัวแปรอินสแตนซ์ในdelegate.

นี่คือสาเหตุที่คุณไม่เห็นmyDataหรือrowเป็นตัวแปร

หากคุณต้องการตรวจสอบผลลัพธ์ของการส่ง-rowหรือ-myDataคุณสามารถใช้คำสั่งpหรือpo:

p (NSInteger)[indexPath row]
po [delegate myData]

หรือใช้หน้าต่างนิพจน์ (ตัวอย่างเช่นหากคุณรู้ว่าคุณdelegateเป็นประเภทจริงMyClass *คุณสามารถเพิ่มนิพจน์(MyClass *)delegateหรือคลิกขวาdelegateเลือกView Value as…และพิมพ์ประเภทจริงของdelegate(เช่นMyClass *)

ดังที่กล่าวไว้ฉันยอมรับว่าดีบักเกอร์อาจมีประโยชน์มากกว่า:

  • อาจมีตัวเลือกเพื่อบอกให้หน้าต่างดีบักเกอร์ใช้ข้อมูลประเภทรันไทม์แทนข้อมูลเวลาคอมไพล์ มันจะทำให้ดีบักเกอร์ช้าลงได้รับ แต่จะให้ข้อมูลที่เป็นประโยชน์

  • คุณสมบัติที่ประกาศสามารถแสดงในกลุ่มที่เรียกว่าคุณสมบัติและอนุญาตให้ตรวจสอบ (ทางเลือก) ได้โดยตรงในหน้าต่างดีบักเกอร์ นอกจากนี้ยังจะทำให้ดีบักเกอร์ช้าลงเนื่องจากจำเป็นต้องส่งข้อความ / เรียกใช้วิธีการเพื่อรับข้อมูล แต่จะให้ข้อมูลที่เป็นประโยชน์ด้วย


ขอบคุณสำหรับคำอธิบาย! สิ่งนี้ช่วยฉันได้มาก! :-)
Manni

7

คุณสามารถพิมพ์ค่าลงในหน้าต่างคอนโซลในขณะรันไทม์ ด้านล่างนี้เป็นขั้นตอน:

  1. วางจุดพักที่คุณต้องการรับค่า
  2. ตอนนี้ทำการดีบักทีละขั้นตอน
  3. วางเคอร์เซอร์ไว้บนตัวแปร / ผู้รับมอบสิทธิ์ซึ่งจะต้องตรวจสอบค่าในขณะทำงาน
  4. ตอนนี้จะแสดงคำอธิบายของตัวแปร / ผู้รับมอบสิทธิ์
  5. เมื่อคลิกที่ "i" จะแสดงคำอธิบายโดยละเอียด
  6. นอกจากนี้ยังจะพิมพ์รายละเอียดลงในหน้าต่างคอนโซล

ภาพหน้าจอสำหรับการพิมพ์รายละเอียดบนหน้าต่างคอนโซล


1
มันทำงานได้ดีไหมฉันเพิ่งเคยเห็นค่าของวัตถุอย่างรวดเร็วเหมือนที่เราเคยเห็นใน obj c
umairhhhs

1
@umairhhhs โพสต์นี้มีไว้สำหรับ Objective-C เท่านั้น
Jayprakash Dubey

1
ฉันสงสัยว่าทำไมสิ่งนี้ถึงไม่อยู่ในโปรแกรมแก้ไขด่วนเพราะมันช่วยได้มากและช่วยประหยัดเวลา
umairhhhs

1

สิ่งนี้จะซับซ้อนเล็กน้อย ออบเจ็กต์เหล่านี้เป็นคลาสหรือโครงสร้างที่กำหนดเองและการมองเข้าไปใน Xcode นั้นไม่ง่ายเหมือนในสภาพแวดล้อมการพัฒนาอื่น ๆ

ถ้าฉันเป็นคุณฉันจะ NSLog ค่าที่คุณต้องการดูพร้อมคำอธิบาย

กล่าวคือ:

NSLog(@"Description of object & time: %i", indexPath.row);

11
ใช่ NSLog เป็นไปได้ แต่ไม่ใช่ทางเลือกที่สะดวกสบายในการดีบัก ฉันประหลาดใจมากที่ไม่มีวิธีแสดงค่าที่ต้องการ ซึ่งเป็นของฟังก์ชันพื้นฐานของสภาพแวดล้อมการพัฒนา
Manni

2
สิ่งที่น่าโมโหที่สุดเกี่ยวกับ XCode น่าสมเพช.
ryan0

1

ลอง Run-> Show-> Expressions

ป้อนชื่ออาร์เรย์หรืออะไรก็ได้ที่คุณต้องการ


ขอบคุณ! ฉันป้อน "indexPath.row" และ "delegate.myData" ในการแสดงออกหน้าต่าง แต่ทุกครั้งที่ปรากฏ "ออกจากขอบเขต" ในคอลัมน์ "สรุปว่า" :-(
Manni

np ฉันมีปัญหาเดียวกันจนกว่าฉันจะพบ;)
tbone

1
ตั้งค่าเบรกพอยต์ทันทีหลังจากที่คุณตั้งค่าอาร์เรย์หรืออะไรก็ตามและคุณจะพบค่าในนิพจน์ Good luck
tbone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.