【发布时间】:2012-03-06 15:09:55
【问题描述】:
我正在使用用于 C++ 的 SWI-Prolog foreign language interface,试图集成一些其他资源。
它大部分都有效,但任何抛出异常的尝试都会导致 SIGSEGV。异常通常用于验证用户参数,因此是接口的基本部分。
我正在从源代码编译 SWI-Prolog(通过提供的脚本),并且 CXX 标志是
-c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC
我使用相同的标志来编译我的 C++ 代码,该代码组装在一个 .so 中,在 SWI-Prolog 中动态加载(我认为是通过 dlopen)。
在 SEGV 在 __cxa_allocate_exception 内的 处显示 IP 之后检查堆栈(通过 GDB)。可能无法访问 __cxa_get_globals@plt。
Dump of assembler code for function __cxa_allocate_exception:
0x00007ffff1d80220 <+0>: push %r12
0x00007ffff1d80222 <+2>: lea 0x80(%rdi),%r12
0x00007ffff1d80229 <+9>: push %rbp
0x00007ffff1d8022a <+10>: mov %r12,%rdi
0x00007ffff1d8022d <+13>: push %rbx
0x00007ffff1d8022e <+14>: callq 0x7ffff1d1de30 <malloc@plt>
0x00007ffff1d80233 <+19>: test %rax,%rax
0x00007ffff1d80236 <+22>: mov %rax,%rbx
0x00007ffff1d80239 <+25>: je 0x7ffff1d802d8 <__cxa_allocate_exception+184>
0x00007ffff1d8023f <+31>: callq 0x7ffff1d1efc0 <__cxa_get_globals@plt>
0x00007ffff1d80244 <+36>: addl $0x1,0x8(%rax)
0x00007ffff1d80248 <+40>: test $0x1,%bl
0x00007ffff1d8024b <+43>: mov %rbx,%rdi
0x00007ffff1d8024e <+46>: mov $0x80,%edx
0x00007ffff1d80253 <+51>: jne 0x7ffff1d803d0 <__cxa_allocate_exception+432>
0x00007ffff1d80259 <+57>: test $0x2,%dil
only resource 我已经找到了似乎相关的声明
异常需要类型信息查找
这可能对 SIGSEGV 有意义。
但我现在无法继续。当然,我希望在一些神奇的 CXX 或 LD 标志。 或者我应该装饰我的库入口点(我熟悉 Windows declspec,我广泛使用它们来构建 MFC 扩展 DLL)或其他什么?
【问题讨论】:
-
我帮不了你,但如果你在这里没有得到答案,请试试 SWI-Prolog 邮件列表 - Jan 对这个列表非常有帮助和关注:swi-prolog.org/Mailinglist.html跨度>
-
@sharky:我已经在那里发帖了(2 月 15 日,C++ FLI 中的例外),但没有任何线索。我还发布了一个最小的测试用例(字面上 2 行的 2 个文件)来重现该错误,但我不知道是否有人验证了它...
标签: c++ c shared-libraries swi-prolog segmentation-fault