2011-01-26 40 views
28

Có một thời gian khó theo dõi sự cố trong ứng dụng iPad. Khó khăn thực sự bắt nguồn từ thực tế là không có lỗi hoặc ngăn xếp dấu vết hiện tại khi ứng dụng không thành công. Nó đơn giản biến mất như Keizer Soze, "Và như thế, poof. Anh ấy đã biến mất."Tai nạn iOS không có lỗi hoặc ngăn xếp dấu vết

Tôi đã sao chép sự cố trên cả trình mô phỏng và thiết bị. Không có nhật ký thiết bị nào, không có gì trong bảng điều khiển, v.v.

Tôi biết rằng trong khi xảy ra sự cố, một số hoạt động đang xảy ra trong chuỗi nền. Thông thường, ba hoặc hơn NSOperations đang đá của một số pha trộn hình ảnh.

Sự pha trộn bao gồm các cuộc gọi CGContext * (DrawImage, SetBlendMode, SetAlpha, v.v.). NSOperation gọi lại cho một đại biểu trong chủ đề chính để xử lý hình ảnh và đặt nó thành UIImage, vì vậy nó không phải là một cuộc xung đột chủ đề giao diện người dùng chính, nhưng tôi không giảm giá bất cứ điều gì vào thời điểm này.

Có một số thủ thuật Xcode mà tôi thiếu để theo dõi chính xác những gì đang xảy ra không? Hoặc ít nhất có được một gợi ý tốt hơn về nơi mà vấn đề nằm?

EDIT Tôi đã chạy ứng dụng trong Bộ nhớ theo dõi sử dụng bộ nhớ và thấy rằng nó khá ổn định trên khoảng 2MB. Vì vậy, đừng nghĩ rằng đó là một vấn đề bộ nhớ. Nhưng sau khi xem xét, đá này ổn định 2MB có vẻ thấp bất thường. Có một cơ hội cụ không được chọn phân bổ CoreGraphics?

+1

Tôi chưa bao giờ thực hiện bất kỳ phát triển iOS * nào, nhưng khi ứng dụng iOS bắt đầu gặp sự cố (và không để lại bất kỳ nhật ký nào), nó đã trở thành vấn đề bộ nhớ thấp: đóng tất cả ứng dụng và khởi động lại thiết bị đã xóa mọi thứ. – Ken

+0

@Ken - đã thêm một chỉnh sửa liên quan đến bộ nhớ thấp. Cảm ơn. – MarkPowell

+0

Đảm bảo bạn không chỉ chạy ứng dụng mà còn gỡ lỗi ứng dụng đó. Để xác minh, hãy chắc chắn Breakpoints đang bật. –

Trả lời

9

Vì thiếu giải pháp tốt hơn và nếu không rõ ràng, hãy ứng dụng ứng dụng của bạn với NSLogs để khoanh tròn nơi xảy ra sự cố, sau đó khoan sâu hơn từ đó qua điểm ngắt và/hoặc nhật ký bổ sung.

16

Thử đọc thanh ghi.

Bất cứ khi nào ứng dụng của tôi gặp sự cố không có lỗi, trong hầu hết các trường hợp, tôi đã tìm thấy ngoại lệ trong sổ đăng ký.

Trước tiên hãy chuyển đến tab Ngoại lệ và 'Thêm điểm ngắt ngoại lệ' bằng cách sử dụng dấu + ở góc dưới cùng bên trái. enter image description here

Sau đó, khi treo ứng dụng bấm vào "0 objc_exception_throw" dưới bài viết 1 enter image description here

Cuối cùng trong giao diện điều khiển nhập:

  • đăng ký đọc (bạn sẽ nhận được một danh sách các thanh ghi)
  • po $ rax (thường là ngoại lệ trong 'rax')

    (bạn sẽ thấy đầu ra ngoại lệ trên bảng điều khiển)

Hy vọng điều này sẽ hữu ích.

+0

Bạn nói "thông thường là ngoại lệ trong 'rax'". Bất kỳ đề xuất cho nơi khác để thử? – Nerrolken

+0

@Nerrolken bạn có thể thử các thanh ghi khác từ danh sách như 'rab', v.v. – shrishaster

+0

Rất cám ơn nó hoạt động cho tôi! – Leo

2

Câu trả lời siêu trễ, nhưng tôi thấy rằng việc sử dụng try/catch giúp cung cấp thông tin khi tôi không thể lấy dấu vết ngăn xếp và ứng dụng của tôi kéo Keizer Soze.

@try 
{ 
    // suspected code causing crash/errors 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"Exception: %@", exception); 
} 
+0

vì lý do nào đó tôi chưa bao giờ thấy công cụ này hoạt động. Mỗi khi tôi đã cố gắng sử dụng nó, ứng dụng bị lỗi theo cùng một cách. Không có ngoại lệ nào bị bắt cho tôi. – SpaceDog

+0

Bạn đã xem câu trả lời @ Paul-Slocum bên dưới chưa? Ngoài ra, cho phép đối tượng zombie không ném ngoại lệ Objective C. Câu trả lời hay ở đây: http://stackoverflow.com/a/8738527/2907798. – dragonflyesque

+0

CÓ. Khi tôi kích hoạt tính năng đó, ứng dụng sẽ hoạt động tốt cho đến khi bộ nhớ bị cạn kiệt và nó bị treo mà không có thông báo hoặc không cung cấp cách gỡ lỗi. Dụng cụ cho thấy không có rò rỉ trên mã của tôi nhưng nó là bộ nhớ chuyên sâu. Bởi vì zombie giữ các yếu tố được phân bổ, nó sẽ sử dụng tất cả bộ nhớ và sự cố. – SpaceDog

0

Trong trường hợp của tôi, đó là do một đối tượng được phát hành. Thông thường nó sẽ nói tin nhắn được gửi đến trường hợp deallocated hoặc một cái gì đó như thế, nhưng nó không.Tôi đã kiểm tra nhật ký của iPhone và tìm thấy bản ghi này: KERN_INVALID_ADDRESS, tôi đã googled và bắt gặp điều này: KERN_INVALID_ADDRESS

Bật đối tượng zombie và thấy rằng tôi đã cố gắng sử dụng một phiên bản được phân phối. Nó cũng cho tôi biết đối tượng trong nhật ký sau đó là gì.

Hy vọng điều này sẽ giúp ích cho khách truy cập trong tương lai.

1

Trong trường hợp của tôi, đó là vì tôi đã bật "Đối tượng Zombie" trong lược đồ để giúp tìm ra sự cố, điều này cuối cùng đã khiến nó hết bộ nhớ và hỏng.

1

Trong trường hợp của tôi, đó là do kết nối ổ cắm kém trong bảng phân cảnh. Kiểm tra sử dụng điểm ngắt nếu viewDidLoad phương thức UIViewController để nạp được gọi. Nếu không, hãy kiểm tra kết nối đầu ra của bạn trong bảng phân cảnh.

Kết nối không chính xác làm hỏng ứng dụng mà không có bất kỳ lỗi hoặc theo dõi ngăn xếp nào.

Tôi tự hỏi điều gì đã xảy ra với lỗi this class is not key value coding-compliant for the key được sử dụng để hiển thị trong các phiên bản XCode cũ hơn.

+0

Đây là vấn đề định kỳ đối với tôi. Hàng chục cửa hàng và một là xấu. Nếu không có một thông báo lỗi thích hợp, nó giống như cố gắng tìm một cây kim trong đống cỏ khô. :( –

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