如果投掷块和着陆垫位于不同的部分,异常处理是否有效?

Does exception handling work if the throw block and landing pad are in diffrent section?

提问人:Kishan Parmar 提问时间:11/15/2023 更新时间:11/15/2023 访问量:81

问:

考虑以下情况,最终崩溃并抱怨放卷机 _URC_END_OF_STACK,在_UA_SEARCH_PHASE中找不到处理程序

class array{
public: 
 int foo() {
      throw 5;
  }
};

int main() {
  array a0;
  try {
    a0.foo();  
  }
  catch(const int )
  {}
}

对于上述情况,我的链接器将 foo 放在.text._ZN5array3fooEv部分,而其他所有内容都放在 .text 部分?LLVM ld.lld(all in .text)并非如此。

C++ 异常 堆栈 - 展开 uncaughtExceptionHandler

评论

1赞 Scheff's Cat 11/15/2023
这在我看来是无辜的。它确实在 coliru 上正常运行(正如我所期望的那样)。您应该在哪个操作系统中使用哪个编译器进行编辑
2赞 Aconcagua 11/15/2023
这一切都在同一个源文件中?根据异常处理的类型,异常不会跨越动态库边界(如果我没记错的话,sjlj 不应该,她会)——但在同一个源甚至库/可执行文件中,这一切都应该没问题;无论如何,这就是异常处理的全部内容!但是,也许您错过了一些编译器标志,例如显式启用异常处理(以及正确的类型)所需的标志?
0赞 teapot418 11/15/2023
与标准中的部分无关。而且标准库抛出的东西没有关于类似限制的警告,所以你的库似乎是一个错误。
0赞 molbdnilo 11/15/2023
对我来说,这种错误消息表明存在内部编译器错误。
1赞 Peter 11/15/2023
@molbdnilo 或者程序的构建和执行方式存在问题(没有给出任何信息)。例如,如果位于 DLL 中,则可能会出现跨越 DLL 边界的异常问题(具体取决于 DLL 的生成方式、程序在运行时如何链接到它等)。A::foo()

答:

-1赞 Kishan Parmar 11/21/2023 #1

main -> .text foo -> .text._ZN5array3fooEv(链接器不合并它们)

答案取决于你的展开库,在这种情况下,mylibUnwind.a 检查 .text 的边界,而 foo 不在 .text 中会导致_URC_END_OF_STACK。

评论

0赞 Jesper Juhl 11/21/2023
这一切都在同一个翻译单元中。这里不涉及展开库或链接器。
0赞 Kishan Parmar 11/25/2023
我建议您阅读一些主题,例如..1) 加载器如何处理可重定位文件。2) 不同的操作系统如何根据他们的标准修改 libunwind..等。