整个异常处理的过程中,涉及到各种层级之间相互调用,同时还有一些函数还会负责处理不同的功能(比如说personality会同时处理search以及clean),这都导致了整个过程相对复杂,因此在这里选择将异常抛出的整个过程再次用文字整理一遍,省略去庞大的代码细节的同时相对轻易的看到了整个过程是如何运转,都做了哪些事情,利于我们的理解。
首先一般的异常实现是由两级组成,一级由语言相关的abi,personality,以及语言相关的exception table(language specificatio data area)组成,用于实际在编译的过程中插入到代码以及生成产物中。
另一级则是libunwind的部分,主要是用于栈回溯,寻找异常栈,被用于在语言相关abi中调用,这部分封装了不同的体系结构以及异常实现方式。
然后我们根据编译到运行的流程来整理一遍