Làm cách nào để thay đổi giá trị biến trong khi gỡ lỗi với LLDB trong Xcode?


173

Trong Xcode, GDB cho phép bạn thay đổi các biến cục bộ trong khi gỡ lỗi (xem cách thay đổi giá trị NSString trong khi gỡ lỗi trong XCode? ). LLDB có cung cấp một chức năng tương tự không? Nếu vậy, làm thế nào chúng ta có thể sử dụng nó?


Đảm bảo xem gỡ lỗi Nâng cao trong iOS . Thật tuyệt vời
Mật ong

Tôi đang cố gắng đặt thuộc tính đối tượng, hoạt động nếu độ dài chuỗi nằm trong khoảng 0-15 ký tự. Đặt chuỗi từ 16 ký tự trở lên được chấp nhận, nhưng khi tôi in lại, nó hiển thị cho tôi một chuỗi vô nghĩa: po myObj.someString = "1234567890123456", hoạt động, nhưng khi tôi in tôi nhận được (Chuỗi? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Câu trả lời:


267
expr myString = @"Foo"

(lldb) giúp expr
Đánh giá biểu thức C / ObjC / C ++ trong ngữ cảnh chương trình hiện tại, sử dụng các biến hiện tại trong phạm vi. Lệnh này nhận đầu vào 'thô' (không cần trích dẫn nội dung).

Cú pháp: biểu thức -

Tùy chọn lệnh Sử dụng: biểu thức [-f] [-G] [-d] [-u] - biểu thức [-o] [-d] [-u] - biểu thức

   -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.

Ví dụ:

expr my_struct-> a = my_array [3]
expr -f bin - (index * 8) + 5
expr char c [] = "foo"; c [0]

LƯU Ý QUAN TRỌNG: Vì lệnh này có đầu vào 'thô', nếu bạn sử dụng bất kỳ tùy chọn lệnh nào, bạn phải sử dụng '-' giữa cuối tùy chọn lệnh và đầu của đầu vào thô.

'expr' là tên viết tắt của 'biểu thức'


1
Thật vậy, cảm ơn! Thêm một câu hỏi nữa: Tôi đang làm điều này để cố gắng thay đổi văn bản của một UILabel: 'expr myLabel.text = @"hello!"nhưng tôi có một error: property 'text' not found on object of type 'UILabel *'... Bạn có suy nghĩ gì không?
Eric

10
expr (void)[label setText:@"Foo"]Hãy làm nó. Dot-Syntax thường không hoạt động trong trình gỡ lỗi. lldb có thể diễn giải nó khi bạn muốn truy cập một thành viên của c-struct, nhưng tôi không chắc đây có phải là lý do nó không hoạt động không. Dot-Syntax không hoạt động cho pomột trong hai. thay vì po label.textbạn phải sử dụngpo [label text]
Matthias Bauch

4
Trên thực tế, lldb xử lý cú pháp dấu chấm tốt hơn nhiều so với gdb. gdb chỉ cho rằng bạn đang đối xử với nó như một cấu trúc C, không thành công. lldb sẽ truy cập chính xác các thuộc tính, nhưng chỉ khi chúng thực sự được khai báo @property.
BJ Homer

28
Bạn cũng có thể sử dụng pnhư một phím tắt cho expr. Ví dụ:(lldb) p url = @"http://google.com"
funroll

11
Bạn cũng có thể sử dụng enhư một phím tắt cho expr. BTW, plà một bí danh cho in ấn là một bí danh cho expr --(chỉ đánh giá đầu vào thô, không có cờ) expr -o -- [object]hoặc pothường cung cấp cho bạn đầu ra hữu ích hơn cho các đối tượng mặc dù.
Jason Newell

21

Các công cụ sau đây làm việc cho tôi. Tôi đang sử dụng Xcode 8.

Nếu bạn muốn đặt một số biến (ví dụ: "dict") thành không và sau đó kiểm tra luồng mã, bạn có thể thử cách sau.

  1. Đặt điểm dừng đúng sau khi khởi tạo đến giá trị mong muốn.
  2. sau đó thực hiện "biểu thức dict = nil" trong dòng lệnh lldb để thay đổi nó. (ví dụ "không")
  3. Bước qua điểm phá vỡ.
  4. Kiểm tra biến "dict" trong dòng tiếp theo. Nó sẽ là con số không.

Nó sẽ trông giống như trong giao diện điều khiển.

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

3

Nếu bạn đang sử dụng Xcode 10 hoặc 11, hãy đặt điểm dừng chính xác sau khi khởi tạo cho biến cần thiết, sau đó bạn có thể thay đổi biến của mình một cách po myString = "Hello World"dễ dàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.