C++ 在Solaris上捕获Oracle中的异常失败

C++ 在Solaris上捕获Oracle中的异常失败,c++,oracle,stored-procedures,exception-handling,solaris,C++,Oracle,Stored Procedures,Exception Handling,Solaris,在我们的代码中,我们试图捕获异常。多年来,这段代码在不同的体系结构和操作系统(x86、x64、SuSe Linux 11 SP2、Oracle 11g、Oracle 12c)中运行良好。现在,我们还在x86/64上试用了Solaris 11.3,在Oracle 12c上试用了Sparc 事实证明,我们无法捕获异常,整个程序都崩溃了。我们生成一个共享对象库,然后将其加载到Oracle中并由存储过程使用。在该存储过程中,我们可能会抛出一个异常,但会捕获它,并使其适合Oracle Solaris 11

在我们的代码中,我们试图捕获异常。多年来,这段代码在不同的体系结构和操作系统(x86、x64、SuSe Linux 11 SP2、Oracle 11g、Oracle 12c)中运行良好。现在,我们还在x86/64上试用了Solaris 11.3,在Oracle 12c上试用了Sparc

事实证明,我们无法捕获异常,整个程序都崩溃了。我们生成一个共享对象库,然后将其加载到Oracle中并由存储过程使用。在该存储过程中,我们可能会抛出一个异常,但会捕获它,并使其适合Oracle

Solaris 11.3/Oracle 12c/x64的组合现在表现得很奇怪: extproc进程正在被终止,Oracle只发送了一条
ORA-28576:到外部过程代理的RPC连接丢失
错误消息

请在找到MVCE

Solaris with SQL Developer上的完整输出为:

declare
  ret number;
begin
    "thrower".test_throw(ret);
end;
Error report -
ORA-28576: lost RPC connection to external procedure agent
ORA-06512: at "thrower.TEST_THROW", line 1
ORA-06512: at line 4
28576. 00000 -  "lost RPC connection to external procedure agent"
*Cause:    A fatal error occurred in either an RPC network connection,
           the extproc agent, or the invoked 3GL after communication had
           been established successfully.
*Action:   First check the 3GL code you are invoking; the most likely
           cause of this error is abnormal termination of the
           invoked "C" routine. If this is not the case, check for
           network problems. Correct the problem if you find it. If all
           components appear to be normal but the problem persists, the
           problem could be an internal logic error in the RPC transfer
           code.  Contact your customer support representative.
此外,使用的
/tmp/debug.log
只生成:

about to throw
相比之下,SuSe的输出为:

declare
  ret number;
begin
    "thrower".test_throw(ret);
end;
Error report -
ORA-20001: foo
ORA-06512: at "thrower.TEST_THROW", line 1
ORA-06512: at line 4
/tmp/debug.log中

about to throw
foo
更令人困惑的是:

  • 同样的代码在Sparc上的Solaris 11.3上运行得非常好
  • 单个可执行文件能够正确地抛出和捕获异常
我这里缺了哪一点?它可能是一个特殊的链接器标志,或者是其他需要为Solaris甚至Oracle激活的东西

编辑:

在@Andrew Henle的提示下,我正在深入研究extproc中使用的编译器和链接器版本,以及使用
strings-a
生成的库,并扫描输出: 在Solaris liboragst上,包含以下字符串(c.f.):

其中,as extproc(Oracle RDBMS生成的加载外部过程的过程)包含以下内容(c.f.):

但是在
/opt/SunProd/studio12u3
上没有安装任何东西

此外,请在下面找到gcc/g++和ld的版本: Solaris:

第二次编辑:

我没有使用Oracle的developerstudio编译库,但仍然得到一个ORA-28576错误,而不是想要的ORA-20001。这是一个“干净”的Solaris 11.3安装,只有Oracle数据库、CMake和Developer Studio 12.6

Cmake问题:

/opt/developerstudio12.6/bin/CC   -DoraGST_EXPORTS -fpic -m64 -std=c++03 -g -KPIC -I/export/opt/ora12cg3d/product/12.1.0/dbhome_1/rdbms/public -o CMakeFiles/oraGST.dir/oGST_manual.cpp.o -c /export/home/paul/test/oGST_manual.cpp

ldd-d liboraGST.so

libstdc++.so.6 =>        /opt/developerstudio12.6/lib/compilers/CC-gcc/lib/amd64/libstdc++.so.6
libgcc_s.so.1 =>         /opt/developerstudio12.6/lib/compilers/CC-gcc/lib/amd64/libgcc_s.so.1
libstatomic.so.1 =>      /opt/developerstudio12.6/lib/compilers/atomic/amd64/libstatomic.so.1
libCrunG3.so.1 =>        /usr/lib/64/libCrunG3.so.1
libm.so.2 =>     /lib/64/libm.so.2
librt.so.1 =>    /lib/64/librt.so.1
libc.so.1 =>     /lib/64/libc.so.1

为了便于参考,您可以在

什么编译器上找到
字符串-a
的输出?您需要非常小心,您的共享对象加载正确的C++运行库,并且那些C++运行时库与Oracle进程本身所使用的任何库相同。同一个可执行文件中不同C++运行时间的副本不起作用。我们不能说您可能需要或不需要什么链接器标志,因为您既没有提供编译命令也没有提供链接命令。您知道“ORA-20001:foo”是用户定义的吗?如你所知,20000条信息是如此。它可能存在于触发器中。@AndrewHenle我添加了此信息后,如果还需要其他信息,请告诉我。@BarbarosÖzhan我完全知道这一点。这是代码在SuSe/Oracle组合上应该产生的结果,但不是在Solaris(x64)/Oracle上,而是在Solaris(Sparc)Oracle上。@AndrewHenle我现在还使用developerstudio中的CC编译了扩展。它最终仍然是一个ORA-28576,而不是定制的ORA-20001。任何想法都很感激。什么编译器?您需要非常小心,您的共享对象加载正确的C++运行库,并且那些C++运行时库与Oracle进程本身所使用的任何库相同。同一个可执行文件中不同C++运行时间的副本不起作用。我们不能说您可能需要或不需要什么链接器标志,因为您既没有提供编译命令也没有提供链接命令。您知道“ORA-20001:foo”是用户定义的吗?如你所知,20000条信息是如此。它可能存在于触发器中。@AndrewHenle我添加了此信息后,如果还需要其他信息,请告诉我。@BarbarosÖzhan我完全知道这一点。这是代码在SuSe/Oracle组合上应该产生的结果,但不是在Solaris(x64)/Oracle上,而是在Solaris(Sparc)Oracle上。@AndrewHenle我现在还使用developerstudio中的CC编译了扩展。它最终仍然是一个ORA-28576,而不是定制的ORA-20001。欢迎提出任何意见。
g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ld --version
ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.2458
/opt/developerstudio12.6/bin/CC   -DoraGST_EXPORTS -fpic -m64 -std=c++03 -g -KPIC -I/export/opt/ora12cg3d/product/12.1.0/dbhome_1/rdbms/public -o CMakeFiles/oraGST.dir/oGST_manual.cpp.o -c /export/home/paul/test/oGST_manual.cpp
/opt/developerstudio12.6/bin/CC  -KPIC -fpic -m64 -std=c++03 -g -m64 -std=c++03 -G -hliboraGST.so -o liboraGST.so CMakeFiles/oraGST.dir/oGST_manual.cpp.o -lstdc++ 
libstdc++.so.6 =>        /opt/developerstudio12.6/lib/compilers/CC-gcc/lib/amd64/libstdc++.so.6
libgcc_s.so.1 =>         /opt/developerstudio12.6/lib/compilers/CC-gcc/lib/amd64/libgcc_s.so.1
libstatomic.so.1 =>      /opt/developerstudio12.6/lib/compilers/atomic/amd64/libstatomic.so.1
libCrunG3.so.1 =>        /usr/lib/64/libCrunG3.so.1
libm.so.2 =>     /lib/64/libm.so.2
librt.so.1 =>    /lib/64/librt.so.1
libc.so.1 =>     /lib/64/libc.so.1