Xcode không hiển thị dòng gây ra sự cố


126

Mỗi khi ứng dụng của tôi gặp sự cố Xcode sẽ làm nổi bật lệnh gọi UIApicationMain () trong hàm main () là dòng gây ra sự cố. Trong một số trường hợp thường là bình thường (ví dụ lỗi phân đoạn) nhưng sự cố tôi đang cố gắng xử lý là một SIGABRT đơn giản với thông tin chi tiết được ghi trong bảng điều khiển:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode được sử dụng để hiển thị dòng vừa phải với SDK cũ hơn nhưng vì tôi đã nâng cấp lên Xocde 4.2 đã thay đổi. Một điều khá rõ ràng là Xcode biết chính xác nguyên nhân gây ra sự cố (hoặc có thể biết), nhưng nó vẫn không hiển thị dòng thực tế. Có bất kỳ sửa chữa hoặc giải pháp cho việc này?


2
Bạn đang biên dịch để phát hành? Nếu vậy hãy thử thiết lập lược đồ thành Gỡ lỗi.
epatel

Nó cũng có thể là một số xib là xấu khiến chương trình bị sập ở một nơi ngoài mã nguồn của riêng bạn, do đó, không hiển thị bất kỳ tệp nào. Lỗi mô tả sự cố đối với khóa từ điển có tên "Ngày"
epatel

1
Apple nên thuê thêm người thử nghiệm;)
Amr Lotfy

Câu trả lời:


301

Bạn cũng nên đảm bảo rằng bạn đã đặt điểm dừng cho tất cả các ngoại lệ. Điều này sẽ khiến Xcode dừng lại ở dòng xảy ra ngoại lệ. Thực hiện như sau [trong Xcode 4]:

  1. Trong Trình điều hướng dự án ở phía bên trái của Xcode, nhấp vào nút điều hướng điểm dừng (gần như toàn bộ phía bên phải của thanh nút trên cùng. Biểu tượng trông giống như một mũi tên phải béo).

  2. Ở dưới cùng của bộ điều hướng, nhấp vào nút "+".

  3. Nhấp vào "Thêm điểm dừng ngoại lệ".

  4. Một điểm dừng mới sẽ được tạo ra. Nó nên được cấu hình khi cần thiết nhưng bạn có thể điều chỉnh hành vi của nó.

  5. Chạy dự án của bạn và tái tạo ngoại lệ.

Ngoài ra, bạn đề cập rằng bạn đã liên kết với một số thư viện / khung công tác của bên thứ 3. Nếu ngoại lệ xảy ra trong các khung đó thì bạn sẽ gặp khó khăn vì mã được biên dịch và Xcode thực sự không thể hiển thị cho bạn dòng gây ra ngoại lệ. Nếu đây là trường hợp và bạn chắc chắn rằng bạn đang sử dụng các thư viện một cách chính xác, thì bạn nên gửi báo cáo lỗi cho những người duy trì các thư viện đó.


4
Tôi là một người mới và đã phát triển gần một tháng mà không có điều này ... điều này thay đổi cuộc sống của tôi.
Jonny Burger

4
Bạn tôi đã đăng ký tài khoản SO chỉ để nâng cấp bài đăng này.
Alex Spencer

1
đây được gọi là một nửa khẳng định về phần táo trong cuốn sách của tôi
ChuckKelly

1
Đã làm điều này nhưng vẫn không thể tìm thấy nơi nó được gọi là độ dài trên null :(
Shereef Marzouk

1
Điều này hoạt động, nhưng nhược điểm là nó không còn cung cấp chi tiết về ngoại lệ trong bảng điều khiển gỡ lỗi. Vì vậy, tôi có thể TẮT điểm dừng này, và xem chi tiết và dấu vết của ngoại lệ nhưng không xảy ra ở đâu, hoặc BẬT nó để xem nó xảy ra ở đâu, nhưng không phải TẠI SAO. Bất cứ ai biết làm thế nào để có cả hai?
Gabriel Jensen

27

Chỉ cần làm theo các hướng dẫn về câu trả lời StackOverflow này:

Kích hoạt Zombie

Về cơ bản, bạn chỉ cần "Kích hoạt Zombie". Sau đó, Xcode sẽ phá vỡ tại bất kỳ dòng nào gây ra vấn đề.

nhập mô tả hình ảnh ở đây

(Người ta hoàn toàn gây sốc rằng, ngay cả trong năm 2017, Xcode vẫn có này tắt theo mặc định. Tại sao bạn sẽ không muốn nhìn thấy những dòng đó gây ra vấn đề? Và " Enable Zombie Objects "?! Thật sao?! Do các tác giả Xcode thực sự tin rằng đây là một cái tên hữu ích, có ý nghĩa gì đối với các nhà phát triển mới? Thật đáng buồn khi đánh giá của Xcode kém như thế nào, năm này qua năm khác, trong App Store. Không ai nghe ...)


6
Xcode là môi trường lập trình tồi tệ nhất mà tôi đã sử dụng cho đến nay.
Học sinh

Điều tôi cảm thấy thú vị (với tư cách là nhà phát triển Visual Studio) là có bao nhiêu nhà phát triển Xcode mà tôi đã gặp, họ khẳng định rằng Xcode là môi trường tốt nhất họ từng sử dụng. Hợp lý, thân thiện và hữu ích .. nhưng với một vài quirks. Ngay cả bây giờ, vào tháng 11 năm 2019, Xcode có xếp hạng App Store là 3,1, với hầu hết mọi người cho nó 5 sao hoặc 1 sao. Không ai nghe ....
Mike Gledhill

9

Chỉnh sửa chương trình hiện tại và cho phép NSZombieEnabled, MallocStackLoggingguard malloc. Sau đó, khi Ứng dụng của bạn gặp sự cố, hãy nhập ứng dụng này trong bảng điều khiển gdb:

(gdb) info malloc-history 0x543216

Thay thế 0x543216bằng địa chỉ của đối tượng gây ra NSInvalidArgumentExceptionvà nó sẽ cung cấp cho bạn một dấu vết ngăn xếp hữu ích hơn nhiều, hiển thị các dòng mã của bạn đang gây ra sự cố.


1
Tôi đã thử điều này và đã bị ném lỗi: 'thông tin' không phải là một lệnh hợp lệ. Có lời khuyên nào không?
achi

@EliGregory đảm bảo trình gỡ lỗi của bạn được đặt thành gdb chứ không phải lldb mặc định. Bạn có thể thay đổi nó trong menu Chỉnh sửa lược đồ trong phần chạy.
chown

2

Tôi đã thấy hành vi này trong mã được tối ưu hóa mạnh mẽ; kiểm tra, điều chỉnh mức tối ưu hóa của mục tiêu của bạn và những người dùng lib của bên thứ 3 có thể giúp ích. (Cài đặt mức tối ưu hóa LLVM 3.0)

Bạn đang tạo biểu tượng gỡ lỗi?


Đã đồng ý. Nếu bạn đang cố gắng gỡ lỗi thì mức tối ưu hóa cần được đặt thành 0 (Không tối ưu hóa) trong cài đặt bản dựng của bạn.
Carter

1

Tôi đã viết mã để tạo ra một sự sụp đổ của chỉ mục ra khỏi ràng buộc. Sau đây là ngoại lệ ném.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Nếu bạn đọc kỹ First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 là các quá trình hệ thống sau sự cố.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 là dòng gây ra ngoại lệ.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3cho bạn biết rằng Tên lớp ( ViewController) và hàm naem ( ComplexFunction) trong đó ngoại lệ được ném.


4
Ơ, được rồi. Bạn hoàn toàn đúng, nhưng điều này có thân thiện không? Trong bất kỳ môi trường phát triển hiện đại nào (những năm 1990 trở đi), khi có ngoại lệ xảy ra, bạn sẽ được đưa đến dòng gây ra sự cố. Trong khi Xcode ... tốt ... cung cấp cho bạn một dấu vết ngăn xếp như thế này. Ngay cả Turbo Pascal cũng không lỗi thời !!!
Mike Gledhill

4
Thật nực cười khi công ty được cho là có "trải nghiệm người dùng tốt nhất" không nhận ra rằng tất cả các nhà phát triển trong 20 năm qua đã quen với việc nhìn thấy số dòng nơi ném ngoại lệ và KHÔNG CÓ LẮP RÁP. Tôi đang phát điên à? Mỗi ngôn ngữ tôi từng làm việc với toàn bộ cuộc đời tôi đều cho số dòng. Ngay cả C hoặc C ++.
mylovemhz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.