2010-04-09 28 views
64

Tôi có một ứng dụng đa luồng rất ổn định trên tất cả các máy thử nghiệm của mình và dường như ổn định cho hầu hết mọi người dùng của tôi (dựa trên không có khiếu nại về sự cố). Tuy nhiên, ứng dụng gặp sự cố thường xuyên đối với một người dùng, những người đủ tử tế để gửi báo cáo sự cố. Tất cả các báo cáo sự cố (~ 10 báo cáo liên tiếp) trông về cơ bản giống hệt nhau:Các ngoại lệ "EXC_BREAKPOINT (SIGTRAP)" có phải do các điểm ngắt gỡ lỗi không?

Date/Time:  2010-04-06 11:44:56.106 -0700 
OS Version:  Mac OS X 10.6.3 (10D573) 
Report Version: 6 

Exception Type: EXC_BREAKPOINT (SIGTRAP) 
Exception Codes: 0x0000000000000002, 0x0000000000000000 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Thread 0 Crashed: Dispatch queue: com.apple.main-thread 
0 com.apple.CoreFoundation  0x90ab98d4 __CFBasicHashRehash + 3348 
1 com.apple.CoreFoundation  0x90adf610 CFBasicHashRemoveValue + 1264 
2 com.apple.CoreText    0x94e0069c TCFMutableSet::Intersect(__CFSet const*) const + 126 
3 com.apple.CoreText    0x94dfe465 TDescriptorSource::CopyMandatoryMatchableRequest(__CFDictionary const*, __CFSet const*) + 115 
4 com.apple.CoreText    0x94dfdda6 TDescriptorSource::CopyDescriptorsForRequest(__CFDictionary const*, __CFSet const*, long (*)(void const*, void const*, void*), void*, unsigned long) const + 40 
5 com.apple.CoreText    0x94e00377 TDescriptor::CreateMatchingDescriptors(__CFSet const*, unsigned long) const + 135 
6 com.apple.AppKit    0x961f5952 __NSFontFactoryWithName + 904 
7 com.apple.AppKit    0x961f54f0 +[NSFont fontWithName:size:] + 39 

(.... nhiều văn bản hơn sau)

Đầu tiên, tôi đã dành một thời gian dài điều tra [NSFont fontWithName: kích thước:]. Tôi nghĩ rằng có thể phông chữ của người dùng đã bị vặn lên bằng cách nào đó, để [NSFont fontWithName: size:] đã yêu cầu một cái gì đó không tồn tại và không vì lý do đó. Tôi đã thêm một loạt các mã bằng cách sử dụng [[NSFontManager sharedFontManager] availableFontNamesWithTraits: NSItalicFontMask] để kiểm tra tính khả dụng của phông chữ trước. Đáng buồn thay, những thay đổi này không khắc phục được sự cố.

Tôi đã nhận thấy rằng tôi đã quên xóa một số điểm ngắt, bao gồm _NSLockError, [NSException raise] và objc_exception_throw. Tuy nhiên, ứng dụng đã được xây dựng bằng cách sử dụng "Release" làm cấu hình xây dựng đang hoạt động. Tôi giả định rằng việc sử dụng cấu hình "Release" ngăn cản việc thiết lập bất kỳ điểm ngắt nào - nhưng sau đó một lần nữa tôi không chắc chắn chính xác các điểm ngắt hoạt động như thế nào hoặc liệu chương trình có cần phải được chạy từ bên trong gdb cho các điểm ngắt không.

Câu hỏi của tôi là: liệu tôi có thể để lại các điểm ngắt được đặt là nguyên nhân gây ra sự cố do người dùng quan sát không? Nếu vậy, tại sao các điểm ngắt sẽ gây ra sự cố chỉ cho một người dùng này? Nếu không, có ai khác có vấn đề tương tự với [NSFont fontWithName: size:] không?

Tôi có thể chỉ cần thử xóa các điểm ngắt và gửi lại cho người dùng, nhưng tôi không chắc chắn số tiền tôi đã để lại với người dùng đó. Và tôi muốn hiểu rõ hơn là liệu việc rời khỏi các điểm ngắt có thể gây ra vấn đề hay không (khi ứng dụng được xây dựng bằng cách sử dụng cấu hình "Phát hành").

Trả lời

159

Trường hợp ngoại lệ “EXC_BREAKPOINT (SIGTRAP)” có phải do các điểm ngắt gỡ lỗi không?

No. Cách khác, thực sự: SIGTRAP (bẫy theo dõi) sẽ làm cho trình gỡ rối ngắt (ngắt) chương trình của bạn, giống như điểm ngắt thực tế. Nhưng đó là bởi vì trình gỡ rối luôn phá vỡ sự cố và SIGTRAP (giống như một số khác signals) là một loại sự cố.

SIGTRAP thường được gây ra bởi NSExceptions được ném, nhưng không phải luôn luôn - thậm chí có thể trực tiếp tự mình raise.

Tôi đã nhận thấy rằng tôi đã quên xóa một số điểm ngắt, bao gồm _NSLockError, [NSException raise] và objc_exception_throw.

Đó không phải là điểm ngắt. Hai trong số đó là hàm và -[NSException raise] là một phương thức.

Ý của bạn là bạn đã đặt các điểm ngắt trên các chức năng đó và phương pháp đó?

tôi cho rằng sử dụng "Release" cấu hình ngăn chặn thiết lập của bất kỳ breakpoints--

số

Các cấu hình là build cấu hình. Chúng ảnh hưởng đến cách Xcode xây dựng các ứng dụng của bạn.

Điểm ngắt không phải là một phần của bản dựng; bạn đặt chúng trong trình gỡ lỗi. Chúng chỉ tồn tại, chỉ bị ảnh hưởng và chỉ dừng chương trình của bạn khi bạn chạy chương trình của mình dưới trình gỡ lỗi.

Vì chúng không phải là một phần của bản dựng nên bạn không thể chuyển điểm ngắt cho người dùng chỉ bằng cách cung cấp cho họ gói ứng dụng.

Tôi không chắc chắn chính xác có bao breakpoint làm việc ...

Khi chương trình của bạn đạt breakpoint, vỡ debugger (ngắt) chương trình của bạn, và rồi bạn có thể kiểm tra trạng thái của chương trình và bước một cách cẩn thận về phía trước để xem làm thế nào chương trình đi sai.

Vì đó là trình gỡ lỗi dừng chương trình của bạn, các điểm ngắt không có tác dụng khi bạn không chạy chương trình của mình trong trình gỡ lỗi.

… hoặc liệu chương trình có cần phải được chạy từ bên trong gdb cho điểm ngắt có hiệu lực không.

. Các điểm ngắt trình gỡ lỗi chỉ hoạt động trong trình gỡ lỗi.

Câu hỏi của tôi là: liệu tôi có thể để lại các điểm ngắt là nguyên nhân gây ra sự cố do người dùng quan sát không?

số

Thứ nhất, như đã nói, ngay cả khi những breakpoint đã bằng cách nào đó được chuyển sang hệ thống của người dùng, breakpoint chỉ có hiệu quả trong trình gỡ lỗi. Trình gỡ rối không thể dừng lại trên điểm dừng nếu chương trình của bạn không chạy dưới trình gỡ lỗi. Người dùng gần như chắc chắn không chạy ứng dụng của bạn trong trình gỡ rối, đặc biệt là vì họ đã đăng xuất khỏi sự cố.

Ngay cả khi chúng đã chạy ứng dụng của bạn trong trình gỡ rối với tất cả các điểm ngắt được thiết lập này, điểm dừng chỉ được nhấn khi chương trình của bạn đạt đến điểm đó, vì vậy một trong các điểm ngắt này chỉ có thể kích hoạt nếu bạn hoặc Cocoa gọi là _NSLockError, -[NSException raise], hoặc objc_exception_throw. Đến thời điểm đó sẽ không phải là nguyên nhân của vấn đề, nó sẽ là một triệu chứng của vấn đề.

Và nếu bạn đã gặp sự cố do một trong số những người được gọi, nhật ký sự cố của bạn sẽ có ít nhất một trong số chúng được đặt tên trong đó. Nó không. Vì vậy, điều này không liên quan đến breakpoint của bạn (máy khác, trình gỡ lỗi không liên quan), và nó không phải là một ngoại lệ Cocoa - như tôi đã đề cập, ngoại lệ Cocoa là một trong những nguyên nhân của SIGTRAP, nhưng chúng không phải là duy nhất một. Bạn đã gặp một số khác.

Nếu không, có ai khác có vấn đề tương tự với [NSFont fontWithName: size:] không?

Không có cách nào chúng tôi có thể biết liệu có bất kỳ vấn đề nào chúng tôi gặp phải là tương tự hay không vì bạn đã xóa nhật ký sự cố. Chúng tôi không biết gì về bối cảnh xảy ra sự cố.

Điều duy nhất tốt để cắt bỏ là phần “Hình ảnh nhị phân”, vì chúng tôi không có gói dSYM của bạn, có nghĩa là chúng tôi không thể sử dụng phần đó để tượng trưng cho nhật ký sự cố.

Mặt khác, bạn có thể. Tôi đã viết an app cho mục đích này; cung cấp nhật ký sự cố cho nó, và nó sẽ tự động phát hiện bó dSYM (bạn đang giữ gói dSYM cho mọi bản phát hành bạn phân phối, đúng không?) và khôi phục tên hàm và phương thức của bạn vào dấu vết ngăn xếp bất cứ nơi nào các hàm và phương thức của bạn xuất hiện.

Để biết thêm thông tin, hãy xem Xcode Debugging Guide.

+2

Wow, cảm ơn câu trả lời toàn diện. • "Ý bạn là bạn đã đặt các điểm ngắt trên các chức năng đó ..." Vâng, đây là ý của tôi. • "Điểm ngắt không phải là một phần của bản dựng ... Chúng chỉ tồn tại, chỉ bị ảnh hưởng, và chỉ dừng chương trình của bạn khi bạn chạy chương trình của bạn dưới trình gỡ lỗi" Cảm ơn, đây chính là điều tôi muốn biết. • "tượng trưng cho nhật ký sự cố ... Tôi đã viết một ứng dụng cho mục đích này" Ứng dụng tuyệt vời. Tôi thường "biểu tượng" bằng trực giác tuyệt đối - nhưng ứng dụng của bạn là một cách tốt hơn! • Tôi đã kết luận rằng điều này phải có một số loại vấn đề với phông chữ của người dùng và sẽ làm việc với nó từ quan điểm đó. – Dennis

+4

+1 dành cho người ký hiệu. –

1

Điểm ngắt không được ghi vào nhị phân. Tỷ lệ cược là tốt mà người này có một cài đặt hệ điều hành bị hỏng. Kiểm tra nhật ký bảng điều khiển cho các tin nhắn dyld.

+0

Cảm ơn câu trả lời nhanh này! Trong Googling xung quanh vấn đề này tôi đã nhận thấy rằng những người khác có EXC_BREAKPOINTS liên kết với các tin nhắn dyld - nhưng các bản ghi sự cố của tôi không hiển thị bất kỳ tin nhắn nào từ dyld. – Dennis

4

Rất có khả năng người dùng này đã cài đặt phông chữ bị hỏng. Theo dõi ngăn xếp chắc chắn hỗ trợ giả thuyết đó, cũng như thực tế là nó chỉ ảnh hưởng đến một người dùng.

Bạn không thể làm gì trong trường hợp đó ngoại trừ người dùng xóa phông chữ vi phạm, vì các sự cố xảy ra diễn ra sâu trong mã của Apple.

Hãy thử để người dùng chạy xác thực phông chữ trong Phông chữ. Để thực hiện việc này, hãy khởi chạy Phông chữ, bấm Tất cả các phông chữ trong danh sách nguồn và sau đó chọn tất cả các phông chữ được liệt kê. Sau đó, bạn có thể chọn Xác thực phông chữ từ menu Tệp.

+1

Cảm ơn lời khuyên này về Font Book - Tôi biết rất ít về Fonts và thực sự đã có một thời gian thú vị xác nhận phông chữ của riêng tôi ... Tôi sẽ đề nghị người dùng thử điều này. – Dennis

+3

+1 cho "đã có một thời gian thú vị xác nhận phông chữ của riêng tôi" – phlebotinum

1

Tôi đã gặp lỗi tương tự. Vì một lý do không thể giải thích, điểm ngắt có trách nhiệm ném EXC_BREAKPOINT ngoại lệ. Giải pháp là xóa điểm ngắt và sau đó mã hoạt động.

EXC_BREAKPOINT là loại ngoại lệ mà trình gỡ rối sử dụng. Khi bạn thiết lập một điểm ngắt trong mã của bạn, trình biên dịch chèn một ngoại lệ của kiểu này trong mã thực thi. Khi thực hiện đạt đến điểm đó, ngoại lệ được ném và trình gỡ rối bắt nó. Sau đó trình gỡ lỗi hiển thị mã của bạn trong dòng "ngắt kết nối". Đây là cách các trình gỡ rối hoạt động. Nhưng trong trường hợp này trình gỡ lỗi không xử lý ngoại lệ một cách chính xác và được trình bày như một lỗi ngoại lệ thông thường.

tôi đã tìm thấy lỗi này hai lần trong cuộc sống của tôi:

  • một sử dụng Xcode khoảng một năm trước.
  • người khác sử dụng Visual C++ khoảng 15 năm trước.
Các vấn đề liên quan