iOS Crash

45 阅读1分钟
  1. ios crash发生时,先产生mach异常,最底层的内核级异常,然后mach异常在host层被ux_exception转换为unix信号,并通过threadsignal将新型号投递到出错的线程

  2. 在捕获crash事件时,优先选mach异常,因为mack异常处理会先于unix信号处理发生,吐过mach异常的handler让程序exitl,那么unix信号就永远不会到达这个进程了,而转换unix信号是为了兼容更为流行的posic标准,这样就不必了解mach内核也可以通过unix信号的方式来兼容开发。

  3. 捕获的nsexception,通过注册nsuncaughtexceptionhandler捕获异常信息。

    //注册异常处理函数
    NSSetUncaughtExceptionHandler(&uncaught_exception_handler)
    
    //异常处理函数
    static void uncaught_exception_handler(NSExcetion *exception){
    //在这里可以获取nsexception信息
    
    abort()
    }
    
  4. 无法捕获的nsexception,利用unix标准的signal机制,注册sigabrt sigbus sigsegv 等嘻嘻你好发生时的处理函数

    //注册处理sigsegv信号 signal(sigsegv,handlesignal) //信号处理 static void handleSignal(int sig){ }

  5. crash 日志组成部分:进程信息、基本信息、异常信息、线程回溯、线程状态和二进制映射。进程信息:Hardware Model 硬件设备信息,Process

  6. sysmbolicatecrash 命令对crash文件进行符号化,symbolicatecrash .dsym app crash.crash 拷贝到桌面下同一个文件夹下

  7. 还可以用atos命令进行符号化