SWIG生成的java代码不能在64位Solaris上处理异常

SWIG generated java code not handling exceptions on 64 bit Solaris

本文关键字:Solaris 64位 处理 异常 不能 java 代码 SWIG      更新时间:2023-10-16

我正在使用swig从c++生成java代码。c++代码抛出异常。无论在32位还是64位代码中,它们都可以在Windows上被捕获。它在32位Solaris上也运行良好。然而,在64位Solaris上,c++代码中出现的任何异常都不会被Java程序捕获。

这是java产生的调用栈的相关部分。这里的CheckThrowError是c++库中抛出异常的函数。

tack: [0xfffffd7ffd34f000,0xfffffd7ffd44f000],  sp=0xfffffd7ffd44e4f8,  free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  0x00000000000ad7c5
C  [libc.so.1+0xe18a9]  _Unwind_RaiseException+0x46
C  [libstdc++.so.6.0.3+0xdc74e]  __cxa_throw+0x5e
C  [libcsclientswig.so+0x552e9]  CheckThrowError(ATLAS::blob_status)+0x37

我正在使用gcc 3.4.3。这里的CheckThrowError是库中抛出异常的函数。

我将非常感谢任何指导,试图解决这个问题。

我发现了这个问题,以防其他人遇到它。从本质上讲,Java使用的solaris C运行时与用于构建c++库的GCC运行时的异常处理是不同的,这导致无法捕获异常。修复它的方法包括强制首先加载GCC运行时,从而导致正确的异常处理。我使用LD_PRELOAD环境变量。

    export LD_PRELOAD=/usr/sfw/lib/amd64/libgcc_s.so

在此之后,Java代码能够处理源自c++的异常。为什么这不是32位的问题,我不知道