2011-11-23 33 views
9

Tôi nhận được chỉ số sau ra khỏi lỗi giới hạn:NSRangeException: Gọi stack Không Hiển thị dòng Số

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 
*** First throw call stack: 
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1) 

Tôi biết chính xác những gì lỗi nghĩa, nhưng tôi thấy các lỗi này rất khó khăn để sửa chữa bởi vì đối với một số lý do ngăn xếp cuộc gọi không cho tôi biết dòng mã nơi mảng được gọi. Đây là ngăn xếp cuộc gọi từ chuỗi 1:

#0 0x9706d9c6 in __pthread_kill() 
#1 0x93e2cf78 in pthread_kill() 
#2 0x93e1dbdd in abort() 
#3 0x02859e78 in dyld_stub__Unwind_DeleteException() 
#4 0x0285789e in default_terminate()() 
#5 0x024c7f4b in _objc_terminate() 
#6 0x028578de in safe_handler_caller(void (*)())() 
#7 0x02857946 in __cxa_bad_typeid() 
#8 0x02858b3e in __cxa_current_exception_type() 
#9 0x024c7e49 in objc_exception_rethrow() 
#10 0x02199e10 in CFRunLoopRunSpecific() 
#11 0x02199ccb in CFRunLoopRunInMode() 
#12 0x039a8879 in GSEventRunModal() 
#13 0x039a893e in GSEventRun() 
#14 0x00732a9b in UIApplicationMain() 
#15 0x00001e5b in main 

Như bạn có thể thấy ngăn xếp cuộc gọi này không hữu ích vì nó không hiển thị bất kỳ phương pháp nào từ mã của tôi. Ngoài ra, ngăn xếp cuộc gọi được hiển thị trong lỗi có 22 địa chỉ bộ nhớ, trong khi ngăn xếp từ chuỗi 1 chỉ có 15 và địa chỉ không khớp chút nào. Không có chủ đề nào khác có vẻ chứa bất kỳ thông tin hữu ích nào.

Làm cách nào để xem chuỗi của "Ngăn xếp cuộc gọi ném đầu tiên" từ lỗi (địa chỉ có 22 địa chỉ), vì vậy tôi có thể tìm thấy dòng gây ra lỗi này? Có lẽ tôi có một cái gì đó đặt không chính xác trong cài đặt xây dựng của tôi mà gây ra các ngăn xếp có liên quan để không thể phục hồi?

Nếu ai đó có thể chỉ cho tôi đúng hướng về điều này, tôi sẽ rất biết ơn. Đang cố gắng xác định vị trí đường phạm vi bằng tay là khá tẻ nhạt.

Cảm ơn!

Trả lời

17

bật trình gỡ lỗi và đặt điểm ngắt trên bất kỳ khi nào ngoại lệ được ném, theo cách này bạn biết chính xác dòng mã nào đang bị giật.

objc_exception_throw

Ngoài ra, [NSException raise];

Hãy nhìn vào những câu dưới đây: Add breakpoint to objc-exception-throw

+9

Cảm ơn Antwan, công trình này hoàn hảo! Đối với bất kỳ ai đang cố gắng thực hiện điều này trong Xcode 4, dưới đây là các bước tôi đã sử dụng: 1. Ở góc dưới cùng bên trái của thanh điều hướng breakpoint (tab thứ 2 từ bên phải) nhấp vào nút Thêm ("+"). 2. Chọn Thêm điểm ngắt ngoại lệ. 3.Đối với "Ngoại lệ", hãy chọn "C++" 4. Bên cạnh "tên" loại "objc_exception_rethrow" 5. Nhấp vào Xong. – llama591

2

Bạn có cho phép breakpoint toàn cầu trong dự án của bạn? nếu không thêm objc_exception_throw vào phần điểm ngắt trong trình điều hướng dự án, sau đó chạy lại ứng dụng, bạn sẽ có được ngăn xếp. Trong adition, khi bạn sụp đổ happends, xem và mở rộng bất kỳ chủ đề bổ sung để xem ngăn xếp của họ là tốt. Nó đã xảy ra với tôi nhiều lần mà chồng tôi đã được tìm kiếm trong một chủ đề nền, mặc dù vụ tai nạn đã được báo cáo bởi các chủ đề chính. HTH.

0

Giả sử điều này xảy ra khi đang trong trình gỡ lỗi XCode, bạn có thể xác định dòng mã được tham chiếu trong các địa chỉ truy nguyên. Trong cửa sổ gỡ lỗi, nhập dữ liệu sau:

danh sách * Địa chỉ từ traceback

Ví dụ, đối với nhập đầu tiên của bạn, bạn sẽ nhập như sau: danh sách * 0x2263052

Làm điều này cho mỗi địa chỉ . Một trong số họ nên trỏ đến mã chương trình của bạn và liệt kê số dòng và mã lỗi ở trên và bên dưới dòng không thành công.

-Steve

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