关于C++异常处理的第19篇文章:我们已经编写了一个personality函数。目前为止,它通过读LSDA,能够在正确的栈帧上选择正确的着陆垫以处理抛出异常,但在一个着陆垫里找出正确的catch有些困难。为了最终得到一个合适的personality合适,我们需要仔细查阅.gcc_except_table里的所有活动表,查看异常可以处理的所有类型。
记得活动表吗?让我们再来看它,不过这次对一个带有多个catch块的try。
# Call site table
.LLSDACSB2:
# Call site 1
.uleb128 ip_range_start
.uleb128 ip_range_len
.uleb128 landing_pad_ip
.uleb128 (action_offset+1) => 0x3
# Rest of call site table
# Action table start
.LLSDACSE2:
# Action 1
.byte 0x2
.byte 0
# Action 2
.byte 0x1