2013-06-03 33 views
12

Vì vậy, tại điểm ngắt, tôi có một đối tượng ngẫu nhiên. Tôi muốn tìm ra đối tượng nào có con trỏ tới đối tượng này. Có cách nào để xem điều này trong bảng điều khiển trình gỡ lỗi không? Có lẽ một cái gì đó cho tôi thấy tất cả các đối tượng có một giữ lại trên đối tượng?LLDB: Hiển thị tất cả các đối tượng có con trỏ đến một đối tượng trong bộ nhớ

Ví dụ: Tôi có một phiên bản NSViewController và tôi muốn xem tất cả các đối tượng khác giữ con trỏ trong trường hợp bộ điều khiển chế độ xem này. Điều này sẽ hữu ích vì nó sẽ cho phép tôi xem hệ thống phân cấp bộ điều khiển xem đang đóng gói cá thể của tôi.

Chỉ là một suy nghĩ điên rồ mà tôi đã thực sự có thể giúp ích nhiều lần.

+1

Tôi không chắc chắn điều đó là có thể. Ngay cả khi thời gian chạy vẫn duy trì loại thông tin đó, bởi vì nó có nghĩa là đứa trẻ có kiến ​​thức về nó là cha mẹ (nó vi phạm các quy tắc phụ thuộc). – CodaFi

+0

Có thể bạn đã đúng. Tôi đã suy nghĩ nhiều hơn của một tìm kiếm bộ nhớ câm cho các đối tượng có chứa một con trỏ đến 0x2827 ... –

+0

Một tìm kiếm bộ nhớ câm sẽ không tìm thấy các đối tượng, mặc dù. Nó sẽ tìm thấy dữ liệu nhưng nó sẽ không biết nó là gì. – StilesCrisis

Trả lời

26

Trong lldb, sử dụng command script import lldb.macosx.heap để cài đặt một số chức năng tìm kiếm bộ nhớ . Lệnh ptr_refs sẽ có thể thực hiện những gì bạn muốn; sử dụng ptr_refs --help để tìm hiểu thêm.

+2

'ptr_refs' là con đường để đi. Nếu bạn khởi chạy ứng dụng của mình bằng biến môi trường 'MallocStackLogging = 1', bạn có thể thực hiện' ptr_refs --stack ADDRESS' và không chỉ xem tất cả các khối bộ nhớ có chứa địa chỉ đó mà ngược lại khi khối đối tượng/bộ nhớ đó được cấp phát hoặc giải phóng. Lưu ý rằng 'ptr_refs' chỉ dành cho các ứng dụng Mac OS X vào thời điểm này - cách nó được triển khai trong Xcode 4.6 ngăn cản nó hoạt động trên iOS. –

+2

Với Xcode 6.3, tôi đã sử dụng thành công 'ptr_refs' trên một ứng dụng iOS chạy trên cả thiết bị (iOS 7.1.2) và trong trình mô phỏng (iOS 8.3), vì vậy có vẻ như không giới hạn ở Mac OS X nữa. – user2067021

+0

@ user2067021, Và bạn đã nhập gì để nó hoạt động? 'lldb.ios.heap' dường như không tồn tại –

0

Không phải là giải pháp hiệu quả hoặc áp dụng trong mọi trường hợp, nhưng bạn có thể gói gọn đối tượng bạn đang tìm kiếm trong phương thức truy cập trên một trong các lớp của bạn và đặt điểm ngắt bên trong. Bằng cách bước vào cuối phương thức accessor, cuối cùng bạn có thể thấy tất cả các điểm gọi.

Ngoài ra, bạn có thể loại bỏ định nghĩa của biến và trình biên dịch sẽ nhổ ra một tấn lỗi, mỗi lỗi cũng sẽ là cuộc gọi đến đối tượng này.

Tôi khuyên bạn nên sử dụng ARC nếu bạn chưa sẵn sàng. Lý tưởng nhất là mã của bạn sẽ không đủ lộn xộn đến mức bạn không thể xác định được tài liệu tham khảo bằng cách đọc qua mã, ARC có thể giúp một chút trong bộ phận đó

Các vấn đề liên quan