วิธีการเปลี่ยนค่าตัวแปรขณะทำการดีบั๊กด้วย LLDB ใน Xcode


173

ใน Xcode GDB อนุญาตให้คุณเปลี่ยนตัวแปรโลคัลขณะทำการดีบัก (ดูวิธีเปลี่ยนค่า NSString ขณะทำการดีบักใน XCode หรือไม่ ) LLDB มีฟังก์ชั่นที่คล้ายกันหรือไม่? ถ้าเป็นเช่นนั้นเราจะใช้มันได้อย่างไร


ตรวจสอบให้แน่ใจที่จะเห็นการแก้จุดบกพร่องใน iOS มันยอดเยี่ยม
ฮันนี่

ฉันกำลังพยายามตั้งค่าคุณสมบัติวัตถุซึ่งทำงานได้ถ้าความยาวสตริงอยู่ระหว่าง 0-15 ตัวอักษร ยอมรับการตั้งค่าสตริงที่มีอักขระ 16 ตัวขึ้นไป แต่เมื่อฉันพิมพ์กลับมันจะแสดงสตริงไร้สาระให้ฉัน: po myObj.someString = "1234567890123456" ซึ่งใช้งานได้ แต่เมื่อฉันพิมพ์ฉันจะได้รับ (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
นิคไรท์

คำตอบ:


267
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'


1
แน่นอนขอบคุณ! อีกหนึ่งคำถามเล็ก ๆ น้อย ๆ : ฉันกำลังทำสิ่งนี้เพื่อพยายามเปลี่ยนข้อความของ UILabel: 'expr myLabel.text = @"hello!"แต่ฉันได้รับerror: property 'text' not found on object of type 'UILabel *'... ความคิดอะไร?
Eric

10
expr (void)[label setText:@"Foo"]ควรทำมัน โดยทั่วไปแล้ว Dot-Syntax จะไม่ทำงานในโปรแกรมดีบั๊ก lldb อาจตีความมันตามที่คุณต้องการเข้าถึงสมาชิกของ c-struct แต่ฉันไม่แน่ใจว่านี่คือเหตุผลที่มันไม่ทำงานหรือไม่ Dot-Syntax ไม่ทำงานpoเช่นกัน แทนที่จะpo label.textต้องใช้po [label text]
Matthias Bauch

4
ที่จริงแล้ว lldb จัดการกับไวยากรณ์จุดได้ดีกว่า gdb gdb เพียงสมมติว่าคุณปฏิบัติต่อมันเหมือน C-struct ซึ่งล้มเหลว lldb จะเข้าถึงคุณสมบัติได้อย่างถูกต้อง แต่ถ้าถูกประกาศด้วย@propertyเท่านั้น
BJ Homer

28
นอกจากนี้คุณยังสามารถใช้เป็นทางลัดสำหรับp exprตัวอย่าง:(lldb) p url = @"http://google.com"
funroll

11
นอกจากนี้คุณยังสามารถใช้เป็นทางลัดสำหรับe exprBTW pเป็นนามแฝงสำหรับการพิมพ์ซึ่งเป็นนามแฝงสำหรับexpr --(เพียงป้อนข้อมูลดิบไม่มีแฟล็ก) expr -o -- [object]หรือpoโดยทั่วไปจะให้ผลลัพธ์ที่มีประโยชน์มากขึ้นสำหรับวัตถุแม้ว่า
Jason Newell

21

สิ่งต่อไปนี้เหมาะสำหรับฉัน ฉันใช้ Xcode 8

หากคุณต้องการตั้งค่าตัวแปร (เช่น "dict") เป็นศูนย์แล้วทดสอบการไหลของรหัสคุณสามารถลองดังต่อไปนี้

  1. ใส่เบรกพอยต์อย่างถูกต้องหลังจากเริ่มต้นเป็นค่าที่ต้องการ
  2. จากนั้นดำเนินการ "expression dict = nil" ในบรรทัดคำสั่ง lldb เพื่อเปลี่ยน (ตัวอย่างเช่น "ไม่มี")
  3. ก้าวข้ามจุดพัก
  4. ตรวจสอบตัวแปร "dict" ในบรรทัดถัดไป มันจะเป็นศูนย์

มันจะมีลักษณะเหมือนในคอนโซล

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

หากคุณใช้ Xcode 10 หรือ 11 ให้ใส่เบรกพอยต์อย่างถูกต้องหลังจากกำหนดค่าเริ่มต้นให้เป็นตัวแปรที่ต้องการจากนั้นคุณสามารถเปลี่ยนตัวแปรของคุณpo myString = "Hello World"ได้อย่างง่ายดาย

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