在MAC OS 异常处理 《一》中谈到了关于异常处理的几种方法,但是都存在缺陷,实际应用性能根据操作系统和执行环境的变化大打折扣。表面的异常处理方法和系统提供的都不够用,没办法,只有想到利用Low Lever的Kernel方法来实现这个异常。
需要注意的是Low Lever的方法可能会根据系统版本不同发生变化,一般不建议初级用户使用。但是在测试过MAC OS(10.4) tiger and MAC OS(10.5) leopard, 至少这两个系统是没问题的,对于新系统10.6还有待测试。
了解异常处理就需要了解系统中关于进程和线程发生异常时的处理情况,在这里我们只针对线程。实际上每个线程对应两个异常端口,一个是自己的异常端口,另一个是自己所属的进程的异常端口。当线程发生问题是,首先将问题发给自己的异常端口,如果异常端口返回正常,则线程就继续往下执行,如果返回不正常,则线程还需要把问题发给进程端口,等待进程端口的返回对象,进程端口返回正确,线程往下执行,返回错误,线程终止,进程也要中止。
第一:我们需要创建一个端口,mach_port_t对象,用来接收线程异常信号。
第二:这里的异常处理就是通过系统设置的thread_set_exception_port Or task_set_exception_port,前者是设置线程端口,后者是设置进程端口。
第三:我们需要创建一个线程来等待mach_port_t对象的信号,并将信号绑定在系统的服务上,函数为Exc_server,通过这个函数系统会调用Catch_exception_raise来实现真正的处理。
最后:我们需要实现Catch_exception_raise函数来对异常处理,通常都是通过重新设置系统当前寄存器变量来实现跳转。
最后希望大家注意的是工程设置属性中需要设置Preserve private external symbols选项方可。