2015-01-23 18 views
10

Trong mục tiêu-C, đôi khi tôi sẽ thiết lập các quan sát trong LLDB để cho tôi biết khi các biến mẫu đã thay đổi. Tôi có thể làm điều này với các thuộc tính Swift không?Có thể đặt các điểm trên thuộc tính Swift không?

Ngay bây giờ, cách duy nhất tôi có thể đạt được điều này là:

  • thêm một handler didSet đối với tài sản và thiết lập một breakpoint bên trong (nhưng điều này đòi hỏi phải dừng chương trình và biên dịch lại, trong đó loại đánh bại mục đích)
  • thêm một breakpoint biểu tượng trên [setPropertyName:] nhưng này chỉ hoạt động nếu lớp xảy ra để hỗ trợ Objective-C lấp

tôi có lựa chọn khác?

Trả lời

14

Câu trả lời đơn giản hơn nhiều so với tôi tưởng tượng. Cách dễ nhất để làm điều này là chỉ cần thêm một điểm ngắt trên khai báo thuộc tính. Trình gỡ rối sẽ phá vỡ bất cứ khi nào thuộc tính được đọc hoặc ghi.

Nếu, như tôi, bạn chỉ muốn ngắt khi thuộc tính bị thay đổi và bỏ qua tìm nạp, đặt điểm ngắt trên khai báo thuộc tính, sau đó đi vào bảng điều khiển LLDB và nhập "danh sách br" để xem danh sách tất cả breakpoint:

(lldb) br list 
Current breakpoints: 
1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 

    1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 
    1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 
    1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0 

Như bạn có thể thấy, có điểm ngắt chính "1" với ba điểm ngắt phụ. Vô hiệu hóa điểm ngắt phụ cho getter:

(lldb) br disable 1.1 
1 breakpoints disabled. 

và bạn đã hoàn tất. Trình gỡ lỗi sẽ chỉ phá vỡ khi thuộc tính đó được sửa đổi.

1

Trên XCode (8.2 Swift 3.0) đặt điểm ngắt bình thường trên thuộc tính nhanh sau đó chạy ứng dụng của bạn. Sau khi ứng dụng đã chạy đi vào bảng điều breakpoint bạn có thể mở rộng breakpoint thành nhiều breakpoint:

enter image description here

Tất cả đều được chọn theo mặc định, bạn có thể vô hiệu hóa những người bạn không cần. LƯU Ý: Tôi tìm thấy khi bạn thêm điểm ngắt đầu tiên, nó sẽ không mở rộng cho đến khi bạn chạy ứng dụng.

Một phương pháp thay thế bạn có thể thử là sử dụng lldb để thêm chúng. Đầu tiên thêm breakpoint một nơi nào đó bên trong cá thể lớp của bạn, ví dụ như viewDidLoad ext. p tự và lưu ý địa chỉ bộ nhớ của cá thể của bạn.

Sau đó thêm điểm ngắt như vậy trong đó 0x0f0f0f0f0f0f là địa chỉ bộ nhớ của lớp học.

break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f’ 
Các vấn đề liên quan