EXC_BAD_ACCESS automatic handling

前端 未结 1 513
鱼传尺愫
鱼传尺愫 2020-12-02 19:26

I\'m trying to build my own signal and uncaught exception handler for iOS. To do this i use these two functions :

NSSetUncaughtExceptionHandler(/*handler*/);         


        
1条回答
  •  暖寄归人
    2020-12-02 19:50

    EXC_BAD_ACCESS doesn't generate an exception so you first function doesn't work with the case. It generates a signal SIGSEGV or SIGBUS.

    Please refer to Handling unhandled exceptions and signals by Cocoa with Love.

    Update

    I just checked the source code of LLDB. It might be TARGET_EXC_BAD_ACCESS = 0x91.

    In 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
    

    and in 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 讨论(0)
提交回复
热议问题