ใน Xcode GDB อนุญาตให้คุณเปลี่ยนตัวแปรโลคัลขณะทำการดีบัก (ดูวิธีเปลี่ยนค่า NSString ขณะทำการดีบักใน XCode หรือไม่ ) LLDB มีฟังก์ชั่นที่คล้ายกันหรือไม่? ถ้าเป็นเช่นนั้นเราจะใช้มันได้อย่างไร
ใน Xcode GDB อนุญาตให้คุณเปลี่ยนตัวแปรโลคัลขณะทำการดีบัก (ดูวิธีเปลี่ยนค่า NSString ขณะทำการดีบักใน XCode หรือไม่ ) LLDB มีฟังก์ชั่นที่คล้ายกันหรือไม่? ถ้าเป็นเช่นนั้นเราจะใช้มันได้อย่างไร
คำตอบ:
expr myString = @"Foo"
(lldb) ช่วย expr
ประเมินนิพจน์ C / ObjC / C ++ ในบริบทโปรแกรมปัจจุบันโดยใช้ตัวแปรที่อยู่ในขอบเขต คำสั่งนี้ใช้อินพุต 'ดิบ' (ไม่จำเป็นต้องอ้างถึงเนื้อหา)ไวยากรณ์: การแสดงออก -
การใช้ตัวเลือกคำสั่ง: expression [-f] [-G] [-d] [-u] - expression [-o] [-d] [-u] - การแสดงออก
-G <gdb-format> ( --gdb-format <gdb-format> ) Specify a format using a GDB format specifier string. -d <boolean> ( --dynamic-value <boolean> ) Upcast the value resulting from the expression to its dynamic type if available. -f <format> ( --format <format> ) Specify a format to be used for display. -o ( --object-description ) Print the object description of the value resulting from the expression. -u <boolean> ( --unwind-on-error <boolean> ) Clean up program state if the expression causes a crash, breakpoint hit or signal.
ตัวอย่าง:
expr my_struct-> a = my_array [3]
expr -f bin - (ดัชนี * 8) + 5
expr ถ่าน c [] = "foo"; ค [0]หมายเหตุสำคัญ: เนื่องจากคำสั่งนี้ใช้อินพุต 'ดิบ' หากคุณใช้ตัวเลือกคำสั่งใด ๆ คุณต้องใช้ '-' ระหว่างตัวเลือกคำสั่งสุดท้ายและจุดเริ่มต้นของอินพุตดิบ
'expr' เป็นตัวย่อของ 'expression'
'expr myLabel.text = @"hello!"
แต่ฉันได้รับerror: property 'text' not found on object of type 'UILabel *'
... ความคิดอะไร?
expr (void)[label setText:@"Foo"]
ควรทำมัน โดยทั่วไปแล้ว Dot-Syntax จะไม่ทำงานในโปรแกรมดีบั๊ก lldb อาจตีความมันตามที่คุณต้องการเข้าถึงสมาชิกของ c-struct แต่ฉันไม่แน่ใจว่านี่คือเหตุผลที่มันไม่ทำงานหรือไม่ Dot-Syntax ไม่ทำงานpo
เช่นกัน แทนที่จะpo label.text
ต้องใช้po [label text]
@property
เท่านั้น
p
expr
ตัวอย่าง:(lldb) p url = @"http://google.com"
e
expr
BTW p
เป็นนามแฝงสำหรับการพิมพ์ซึ่งเป็นนามแฝงสำหรับexpr --
(เพียงป้อนข้อมูลดิบไม่มีแฟล็ก) expr -o -- [object]
หรือpo
โดยทั่วไปจะให้ผลลัพธ์ที่มีประโยชน์มากขึ้นสำหรับวัตถุแม้ว่า
สิ่งต่อไปนี้เหมาะสำหรับฉัน ฉันใช้ Xcode 8
หากคุณต้องการตั้งค่าตัวแปร (เช่น "dict") เป็นศูนย์แล้วทดสอบการไหลของรหัสคุณสามารถลองดังต่อไปนี้
มันจะมีลักษณะเหมือนในคอนโซล
(lldb) expression dict = nil
(NSDictionary *) $5 = nil
หากคุณใช้ Xcode 10 หรือ 11 ให้ใส่เบรกพอยต์อย่างถูกต้องหลังจากกำหนดค่าเริ่มต้นให้เป็นตัวแปรที่ต้องการจากนั้นคุณสามารถเปลี่ยนตัวแปรของคุณpo myString = "Hello World"
ได้อย่างง่ายดาย