内容简介:我们的小ABI项目(让我们回顾一下:我们弄明白了我们用于有我们希望运行捕捉的函数的LSDA具有下面的调用表(即,下面着陆垫【即,下面的catch块】):
作者: nicolasbrailo
我们的小ABI项目( 链接 )能够抛出异常了,现在我们致力于捕捉它们;上次我们实现了一个能够检测及处理异常的personality函数,但它仍然有点不完整:即使在应该停止时它能正确地通知栈回滚器,但我们版本的__gxx_personality_v0不能执行catch块里的代码。上次我们学会了如何读LSDA,因此现在仅有的问题是,把各部分拼起来,在我们的personality函数里读.gcc_except_table。
让我们回顾一下:我们弄明白了我们用于有我们希望运行捕捉的函数的LSDA具有下面的调用表(即,下面着陆垫【即,下面的catch块】):
|
|
|
在我们函数的汇编代码里,所有这些表可以被映射到不同的位置,但对一篇博文这有点太混乱了(我建议你自己反汇编函数并尝试匹配每个标记,这样做可以学到很多东西)。同样,归功于某些网页,我们学到了这个表的格式。
让我们这样做来看我们是否在正轨上(小心读对齐问题,记住像这样定义CFI仅能对uint8工作,并可能不可移植):
|
|
|
备注:你可以从我的 github repo 下载完整的源代码。
正如你看到的,如果你运行这个代码,调用表里所有的项是相关的。与什么相关?函数的开头。这意味着如果我们希望得到特定着陆垫的EIP,我们要做的是_Unwind_GetRegionStart + LSDA_Call_Site.cs_lp!
现在我们应该能解决我们的异常问题:让我们尝试修改我们的personality函数来运行正确的着陆垫。现在我们需要恢复执行:_Unwind_SetIP。让我们再次修改personality函数来运行第一个可用的着陆垫,这通过查看汇编我们已经知道我们想要的那个:
|
|
|
尝试运行它,看到一个漂亮的无限循环。你能猜到哪里错了?答案在下一篇。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring Cloud微服务实战
翟永超 / 电子工业出版社 / 2017-5 / 89
《Spring Cloud微服务实战》从时下流行的微服务架构概念出发,详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍,《Spring Cloud微服务实战》主要以示例与源码结合的方式来帮助读者更好地理解这些组件的使用方法以及运行原理。同时,在介绍的过程中,还包含了作者在实践中所遇到的一些问题和解决思路,可供读者在实践中作为参考。 《Sp......一起来看看 《Spring Cloud微服务实战》 这本书的介绍吧!