2009-08-24 39 views
11

Tôi gặp sự cố khi đang sử dụng ống thoát nước NSAutoreleasePool. Có lẽ các hồ bơi đang cố gắng để deallocate một đối tượng đã được phát hành sớm bởi một đoạn mã. Vụ tai nạn tôi có là ở giữa số objc_msgSend vì nó đang cố gắng gửi thư đến một đối tượng không tồn tại nữa.Cách tốt nhất để gỡ lỗi sự cố trong objc_msgGửi?

Với trạng thái ngăn xếp, các mẹo/thủ thuật/quy trình/gdb lệnh nào tôi có để tôi có được thông tin về đối tượng được đề cập và/hoặc điểm xảy ra giao dịch bất hợp pháp?

Trả lời

16

Nếu bạn có linh cảm là việc xóa sớm, hãy bật zombie để xác nhận giả thuyết của bạn và sau đó gỡ lỗi những gì đang diễn ra. Khi bạn kích hoạt zombie, các đối tượng không thực sự bị phá hủy, nhưng được đặt thành trạng thái zombie, giúp bạn phát hiện khi chúng được truy cập sau khi chúng được gọi là dealloc. Đọc thêm từ NSZombieEnabled

+3

Ngoài ra, bạn có thể sử dụng công cụ Object Alloc cụ để theo dõi các sự kiện giữ lại/giải phóng của đối tượng được phát hành sớm. Đây không phải là vấn đề đáng lo ngại của hồ bơi autorelease, đó là vấn đề, nhưng một số vấn đề trước đó vẫn thường xuyên xảy ra. – bbum

+0

@Pang Tôi vừa cập nhật liên kết. – inga

3

Nếu bạn sử dụng NSZombieEnabled, ít nhất bạn có thể tìm ra đối tượng lớp là gì.

+2

Trong khi đúng, của tequilatango câu trả lời cung cấp câu trả lời cùng với một số chi tiết hữu ích. – bbum

+0

Khá đúng. Tôi có thể có ít nhất cung cấp một liên kết đến thông tin bên ngoài. – Wevah

2

tôi đi qua những gì dường như là một tai nạn trong objc_msgSend. Những gì thậm chí còn xa lạ là application:didFinishLaunchingWithOptions: thậm chí không đạt được trước khi vụ tai nạn được gọi là xảy ra!

Trong trường hợp của tôi vụ tai nạn hóa ra là điểm dừng mà tôi đã vô tình đặt trên một địa chỉ bộ nhớ đã được gọi trước khi bất kỳ mã nào của tôi thậm chí đạt được.

enter image description here

Sau giờ hoặc lâu hơn cố gắng để con số này ra, tôi bỏ chọn breakpoint, chạy các mã, mặt palmed và sau đó tiếp tục ngày của tôi giả vờ nó chưa bao giờ xảy ra ...

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