ดีบักเกอร์ Xcode ไม่พิมพ์วัตถุและแสดงว่าไม่มีเมื่อใด


165

Xcode แสดงข้อผิดพลาดเมื่อพยายามพิมพ์วัตถุด้วยpo <objectName>แต่เพียงหนึ่งโครงการ

ภาพหน้าจอ

ข้อผิดพลาด: ไม่สามารถทำให้เป็นจริง struct: ขนาดของตัวแปร <varName> ไม่เห็นด้วยกับขนาดของ ValueObject เกิดข้อผิดพลาดในการดำเนินการไม่สามารถ PrepToExecuteJITExpression

ดีบัก Xcode ยังแสดงวัตถุทั้งหมดเป็นnil( selfยกเว้น) เมื่อพวกเขาไม่ได้ ( NSLogแสดงผลลัพธ์ที่ถูกต้องตามที่เห็นในภาพ) ฉันไม่รู้ว่าเกิดอะไรขึ้นกับโครงการ โครงการอื่น ๆ ทำงานได้ดี

มีความคิดอะไรที่จะเป็น? (การทำความสะอาดโครงการไม่มีผลกระทบ)


สำหรับฉันดูเหมือนว่าจะมีปัญหาตัวชี้บางอย่าง แต่ฉันแน่ใจว่าจะซื่อสัตย์จริงๆ คุณพยายามทำอะไรให้สำเร็จ
user2967030

3
ข้อผิดพลาดเกิดขึ้นกับทุกวัตถุของโครงการ แม้กระทั่งNSStringสร้างหนึ่งบรรทัดเหนือจุดพัก!
Binarian

1
ดังที่ได้กล่าวไว้ในคำถามการทำความสะอาดไม่เปลี่ยนแปลงอะไรเลย (แต่ขอบคุณสำหรับการลองเพิ่มข้อความแสดงข้อผิดพลาด
Binarian

3
คุณแน่ใจหรือไม่ว่าคุณกำลังสร้างโดยไม่มีการเพิ่มประสิทธิภาพ (-O0)
iccir

1
การเพิ่มประสิทธิภาพสามารถตั้งค่าได้ไม่เพียง แต่ในการตั้งค่าโครงการ แต่ในเป้าหมายด้วย มี m ติดอยู่ :(
โหระพา

คำตอบ:


269

คุณแน่ใจหรือว่าคุณไม่ได้อยู่ใน "โหมดการเปิดตัว"?

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


3
ฉันมีเพียงหนึ่งการกำหนดค่าวิธีการเปลี่ยนการกำหนดค่าเพื่อให้เป็นdebug configurationอย่างไร
Binarian

2
อ่าฉันสร้างโครงการที่ว่างเปล่าและตอนนี้สามารถเห็นความแตกต่างทั้งหมดในBuild Settingsคุณสมบัติการปรับใช้Strip debug symbols during copyถูกตั้งค่าเป็น YES
Binarian

16
@ Alex1987 ผมตั้งStrip debug symbols during copyไปNOและOptimization LevelไปNone -O0ในโครงการBuild Settings
Binarian

32
น่าเสียดายที่ในบางสถานการณ์ lldb กำลังทำสิ่งนี้เมื่ออยู่ในโหมดแก้ไขข้อบกพร่องโดยมีการปรับให้เหมาะสมและมีสัญลักษณ์การดีบักอยู่ ใช้เวลาในการเยี่ยมชมรายงานข้อผิดพลาด com
ctpenrose

4
มีปัญหาเดียวกัน - ระดับการเพิ่มประสิทธิภาพคือ "ไม่มี" ปัญหาคือการที่ Link-Time Optimization (LTO) ถูกตั้งค่าเป็น "ใช่" สำหรับโหมดดีบัก
pi3

38

ฉันได้ตั้งค่า "ระดับการเพิ่มประสิทธิภาพ" สำหรับการกำหนดค่า Debug เป็น "ไม่มี" และได้แก้ไขปัญหาแล้ว


2
ตลกที่ไม่ได้ทำงาน ฉันทำตรงกันข้าม ฉันเปลี่ยนไปFastest, Smallest[-Os]ใช้งานได้
Nate Hat

ข้อเสนอแนะที่แตกต่างกันมากมาย แต่อันนี้ (การตั้งค่า Debug optimization เป็น None) แก้ไขให้ฉัน
Dejal

29

ตรวจสอบให้แน่ใจว่าได้ปิดการทำความสะอาดที่อยู่ในการตั้งค่าโครงการของคุณ Address Sanitizer ไม่สามารถทำงานร่วมกับดีบักเกอร์ได้ดี

  1. ไปที่ Edit Scheme (ผลิตภัณฑ์ >> Scheme >> Edit Scheme) เลือก Run และไปที่แท็บ Diagnostics
  2. ตรวจสอบให้แน่ใจว่า "Enable Address Sanitizer" ปิดอยู่

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


4
นี่คือทางออกสำหรับฉัน เห็นได้ชัดว่ามีเหตุผลมากมายที่สามารถเกิดขึ้นได้
manroe

16

ดูเหมือนว่าทุกคนมีทางออกของตัวเอง

สำหรับฉันฉันใช้Objective-CและSwiftในเวลาเดียวกัน

ก่อนอื่นให้ไปที่TARGETS -> Build Settingsและค้นหาcode generation

คุณจะพบApple LLVM 6.0 และ Swift Compiler

เปลี่ยนพวกเขาOptimization Levelทั้งหมดเป็นNoneDebug แล้วคุณอาจพบว่าไม่ได้nil

น่าประหลาดใจเมื่อคุณเห็นคุณค่าคุณสามารถแก้ไขปัญหานี้ได้อย่างถาวรจากนั้นคุณสามารถเปลี่ยนสิ่งOptimization Levelที่เคยเป็น


11

มีวิธีอื่นที่สามารถเกิดขึ้นได้ สำหรับฉันมันเป็นเพราะค่า "ค่าสถานะ C อื่น ๆ " ถูกตั้งค่าเป็น "-O2" แม้กระทั่งสำหรับการสร้างการดีบัก การปิดสิ่งนี้สำหรับบิลด์การตรวจแก้จุดบกพร่องแก้ไขปัญหาได้


9

เอาต์พุตการดีบักที่กรองแล้ว

สำหรับฉัน Xcode กำลังกรองเอาท์พุทดีบักเกอร์ ตรวจสอบให้แน่ใจว่าการตั้งค่าผลลัพธ์ของคุณคือดีบักเกอร์เอาต์พุตหรือเอาต์พุตทั้งหมด


6

ฉันเพิ่งพบปัญหานี้และพบว่าเป็นเพราะDeployment Postprocessing = YESในการตั้งค่าการสร้าง

เปลี่ยนเป็นNOแก้ไขตามที่เห็นในภาพหน้าจอด้านล่าง:

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

รุ่น Xcode: 6.0.1 (6A317) บน OSX 10.9.5


5

ฉันเพิ่งพบปัญหาที่คล้ายกัน: ณ จุดหนึ่งทันใดนั้น debugger Xcode ก็พิมพ์วัตถุบางประเภทโดยเฉพาะ NSStrings เป็น (null) แม้ว่าพวกเขาจะเริ่มต้นด้วยค่า พิมพ์ออกมาทาง

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

แสดงค่าที่ถูกต้องสำหรับวัตถุ

ทำให้เกิดความสับสน! การแก้ปัญหาค่อนข้างง่าย: ฉันเพิ่งปิดระบบ Xcode และรีสตาร์ทคอมพิวเตอร์ หลังจากฉันรีสตาร์ท Xcode ทุกอย่างทำงานได้ดีอีกครั้ง :)


5

ตรวจสอบให้แน่ใจว่าLink-Time Optimization = Noโหมดดีบั๊กใน Build Settings


ฉันเพิ่งพบปัญหานี้ใน Xcode 8 เฉพาะในการตั้งค่าการสร้างเฟรมเวิร์กไดนามิกของฉันเท่านั้น! ขอบคุณ
vmeyer

3
  1. ลบข้อมูลที่ได้รับ
  2. ค่อนข้าง Xcode / รีสตาร์ท
  3. ทำความสะอาดโครงการ

นั่นคือทั้งหมดที่ใช้สำหรับฉัน


2

โซลูชั่นที่นี่จะแก้ไขข้อผิดพลาดที่คุณเห็นerror: <EXPR>:1:1: error: use of unresolved identifierทุกครั้งที่คุณพยายามpoตัวแปร

สำหรับผมการแก้ปัญหาคือจะไปBuild Settingsและค้นหาOptimization Levelและให้แน่ใจว่าแต่ละการตั้งค่าถูกกำหนดให้DebugNone


สิ่งนี้แก้ไขได้จริงสำหรับฉัน ความคิดใดที่ข้อเสียสำหรับการปิดใช้งานการตั้งค่าคืออะไร?
Jasper

1

ไปที่ "Other C Flags" ในการตั้งค่าการสร้างและตั้งค่าการแก้ปัญหาจาก -o2 ถึง -O0


0

ฉันพบปัญหานี้เช่นกันและเมื่อฉันพบว่าฉันอยู่ในโหมดเผยแพร่ฉันเปลี่ยนไปแก้จุดบกพร่อง ... ไม่มีการแก้ไข ปรากฎว่าฉันต้องทำความสะอาดก่อน (cmd + shift + k)

ดังนั้นฉันคิดว่าสิ่งที่เกิดขึ้นคือหลังจากสร้างในโหมดรีลีสไม่ใช่ทุกอย่างถูกคอมไพล์ในการพัฒนาและดังนั้น lldb จึงไม่สามารถอ่านสัญลักษณ์ได้อย่างถูกต้อง หลังจากทำความสะอาดและคอมไพล์ซ้ำในการพัฒนามันใช้งานได้สำหรับฉัน


-3

ความจริงก็คือระบบควรทำงานนอกกรอบและไม่ได้เกิดจากการเชื่อมโยงไปยังการตั้งค่าที่แตกต่างกันจำนวนมากจนถึงจุดที่สิ่งต่าง ๆ อาจใช้งานได้สำหรับคุณหรือไม่

ทำไมระบบไม่อนุญาตให้ดีบั๊กเสมอเมื่ออยู่ในโหมดแก้ไขข้อบกพร่องเป็นปริศนาที่ Apple เท่านั้นที่สามารถตอบได้ (ถ้าพวกเขาสนใจซึ่งฉันสงสัยว่าพวกเขาทำ)

ท้ายที่สุดความแตกต่างระหว่าง debug / non-debug จะเป็นตารางพิเศษที่มีเมทาดาทาซึ่งเติมเฉพาะในหน่วยความจำ / พื้นที่ดิสก์

หากคุณกำลังรวบรวมกับเครื่องจำลองหรืออุปกรณ์โดยตรงคุณจะไม่สนใจเมกะไบต์พิเศษเหล่านั้น

ดังนั้นเราต้องใช้ลูปพิเศษเพื่อทำสิ่งพื้นฐานและเรียบง่ายซึ่งทุกสิ่งที่ฉันรู้ตั้งแต่ศตวรรษที่แล้วทำได้ดี

และเพื่อเพิ่มสำหรับฉันสิ่งที่ทำงานคือการเปลี่ยนแปลงใน "Debug" การเพิ่มประสิทธิภาพการเชื่อมโยงเวลาจาก "เสาหิน" เป็น "ไม่" (xcode 8)


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