gpt4 book ai didi

c++ - 跨越二进制边界的异常

转载 作者:IT老高 更新时间:2023-10-28 21:48:18 25 4
gpt4 key购买 nike

我知道,这个问题已经被问过很多次了,但是我找不到我的问题的解决方案。

我有以下情况:

   A
/ \
/ \
B <-- C
  • A 是一个包含类 EException
  • 的共享库
  • B 和 C 链接到 A
  • C 也是一个共享库
  • B 在运行时动态加载 C

在某些时候,C 会抛出 EException 的一个实例:

void doSometing() {
throw EException("test-message");
}

B中我想捕捉这个异常:

try {
doSomething();
} catch (const EException& ex) {
// Not reached
} catch (...) {
// Not reached
}

但正如代码中所提到的,没有一个 catch 子句被调用。相反,执行此代码的线程被中止。

我尝试了以下方法:

  • EException的可见性属性在编译A时设置为“default”
  • EException 头文件只包含声明
  • 我在 A、B 和 C 中使用链接器选项 -fvisibility=hidden
  • 我在 C 中使用链接器选项 -E

使用 nm 我得到 A:

0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
0000000000066260 T EException::EException(QString const&)
0000000000066306 T EException::EException(EException const&)
00000000000661d0 T EException::EException()
00000000000664de T EException::~EException()
000000000006641e T EException::~EException()
000000000006641e T EException::~EException()
00000000000663b6 T EException::operator=(EException const&)
<...>
000000000028de40 V typeinfo for EException
000000000028dd80 V typeinfo for EException*
000000000007342b V typeinfo name for EException
0000000000072ab7 V typeinfo name for EException*
000000000028de00 V vtable for EException

对于B:

U EException::EException(QString const&)
U EException::~EException()
<...>
0000000000726f60 V typeinfo for EException

对于C:

U EException::EException(QString const&)
U EException::~EException()
<...>
U typeinfo for EException

问题可能是,B 使用自己的 EException 类型信息,而 C 使用 A< 提供的类型信息?我该如何解决这个问题?

我的环境:

  • x86_64-linux-gnu 上的 gcc 4.6.3
  • 使用 Qt

感谢您的帮助!

最佳答案

我在 gcc < 4.5 和跨共享库边界使用 RTTI 符号时遇到了类似的问题,但在 gcc 4.6 中没有。但是,您可能仍然会发现以下信息很有用。

如前所述,EException 的 vtable(包含 typeinfo 对象的条目)似乎在某些翻译单元中重复,这绝对是 gcc < 4.5 的问题(嗯,它是据我所知,libsupc++ 的问题没有合并 type_info 对象)。通过在 A 中定义一个虚拟的外联析构函数(它必须是头文件中的第一个虚拟函数声明)来锚定 EException 的 vtable,这对我来说是诀窍。

发布 EException 的完整头文件也可能会有所帮助。

关于c++ - 跨越二进制边界的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com