2012-04-25 34 views
13

Tôi đang cố gắng xây dựng trình xử lý ngoại lệ và tín hiệu riêng của mình cho iOS. Để làm điều này tôi sử dụng hai chức năng:Xử lý tự động EXC_BAD_ACCESS

NSSetUncaughtExceptionHandler(/*handler*/); 

signal(/*signal const*/, /*signal handler*/); 

Vấn đề của tôi là tôi không thể làm cho nó hoạt động với tín hiệu EXC_BAD_ACCESS. Có một số tín hiệu liên tục (như SIGABRT, SIGBUS) để bắt EXC_BAD_ACCESS? Nếu không, làm thế nào tôi có thể xử lý nó? Một số công cụ phân tích sự cố (lika PLCrashReporter, Crashlytics, v.v.) có thể theo dõi nó ...

+1

Xem bài đăng này: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- tất cả các lỗi-trên-iphone – Lefteris

+0

tốt, ive đã bao gồm SIGSEGV nhưng nó vẫn không bắt EXC_BAD TRUY CẬP:/​​hmmmm ... nhưng cảm ơn cho bình luận! :) –

Trả lời

8

EXC_BAD_ACCESS không tạo ngoại lệ nên chức năng đầu tiên của bạn không hoạt động với trường hợp đó. Nó tạo ra một tín hiệu SIGSEGV hoặc SIGBUS.

Vui lòng tham khảo Handling unhandled exceptions and signals bởi Cocoa với tình yêu.

Cập nhật

tôi chỉ kiểm tra mã nguồn của LLĐB. Có thể là TARGET_EXC_BAD_ACCESS = 0x91.

Trong RNBRemote.h:

/* We translate the /usr/include/mach/exception_types.h exception types 
    (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses 
    in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS). These hard 
    coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb 
    values in its include/gdb/signals.h. */ 

#define TARGET_EXC_BAD_ACCESS  0x91 
#define TARGET_EXC_BAD_INSTRUCTION 0x92 
#define TARGET_EXC_ARITHMETIC  0x93 
#define TARGET_EXC_EMULATION  0x94 
#define TARGET_EXC_SOFTWARE  0x95 
#define TARGET_EXC_BREAKPOINT  0x96 

và trong RNBRemote.cpp:

// Translate any mach exceptions to gdb versions, unless they are 
// common exceptions like a breakpoint or a soft signal. 
switch (tid_stop_info.details.exception.type) 
{ 
    default:     signum = 0; break; 
    case EXC_BREAKPOINT:  signum = SIGTRAP; break; 
    case EXC_BAD_ACCESS:  signum = TARGET_EXC_BAD_ACCESS; break; 
    case EXC_BAD_INSTRUCTION: signum = TARGET_EXC_BAD_INSTRUCTION; break; 
    case EXC_ARITHMETIC:  signum = TARGET_EXC_ARITHMETIC; break; 
    case EXC_EMULATION:   signum = TARGET_EXC_EMULATION; break; 
    case EXC_SOFTWARE: 
     if (tid_stop_info.details.exception.data_count == 2 && 
      tid_stop_info.details.exception.data[0] == EXC_SOFT_SIGNAL) 
      signum = tid_stop_info.details.exception.data[1]; 
     else 
      signum = TARGET_EXC_SOFTWARE; 
     break; 
} 
+0

:) cảm ơn bạn đã trả lời! Tôi đang viết "module" của tôi từ hướng dẫn này và như tôi đã nhận xét câu hỏi của tôi trước đó tôi đã xử lý SIGSEV và SIGBUS nhưng không có may mắn. tôi vẫn không thể xử lý EXC_BAD_ACCESS ... thử đọc các bình luận trong hướng dẫn về ca cao với tình yêu ... ít người đang gặp vấn đề tương tự như tôi ... –

+0

Nhìn vào mã nguồn của LLDB và cập nhật những phát hiện của tôi trong câu trả lời của tôi ... – Hailei

+0

CẢM ƠN! có thật không! :) điều này rõ ràng có thể là một giải pháp cho vấn đề này ... nhưng bây giờ tôi đang bối rối, vì tôi là một người mới đến thế này, làm thế nào tôi có thể xử lý nó? :) tín hiệu gọi (0x91,/* handler) đã không giúp ... tôi phải nhìn ngu ngốc bây giờ :) –

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