Proc*C 应用程序在 Oracle 12.2 中崩溃

Proc*C Application Crashing With Oracle 12.2

本文关键字:崩溃 Oracle 应用程序 Proc      更新时间:2023-10-16

在172.19.112.43服务器上运行某些应用程序时,oracle导致应用程序崩溃。Oracle Version 12.2 , Linux Version - Red Hat Enterprise Linux Server Release 6.0 (Santiago(。

请在下面找到崩溃轨迹:

0  0x00007f332756754b in raise () from /lib64/libpthread.so.0 
1  0x00007f33233eb212 in skgesigOSCrash () from   /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
2  0x00007f3323a0b535 in kpeDbgSignalHandler () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
3  0x00007f33233eb550 in skgesig_sigactionHandler () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
4  <signal handler called> 
5  0x00007f332144220c in kpudfni () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
6  0x00007f3321442f9b in kpudfn2 () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
7  0x00007f33213c5e8a in sqlcucDefine () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
8  0x00007f3323d225cb in sqlall () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
9  0x00007f3323d1f5bc in sqlnst () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
10 0x00007f3323d1b206 in sqlcxt () from /home0/ora12c/app/ora12c/product/12.2.0/dbhome_1/lib/libclntsh.so.12.1 
11 0x00007f3326a88c51 in CSTDbConnection::ProcessSelect (this=0x646900 <objDBConn>, VecColumnsobj=std::vector of length 1, capacity 1 = {...}, VecWheresobj= 
std::vector of length 1, capacity 1 = {...}, strOrderBy="") at    STDbConnException.cpp:11377 

这种情况在许多应用程序中都会发生。同一个应用程序在 Oracle 12.1 中运行绝对正常,但在 Oracle 12.2 上运行应用程序时,它崩溃了。我们还通过在 sqlnet.ora 文件中设置以下参数来禁用客户端和服务器端的诊断功能。

DIAG_ADR_ENABLED=关闭

DIAG_SIGHANDLER_ENABLED=假

DIAG_DDE_ENABLED=假

但即使这样也无济于事。引发此错误的代码段是:

short nIndex7=0;
int intVecIndex=0;
int LastIndex =0;
while(true)
{
memset(szDBErrorCode,'',DB_ERROR_LEN);
vector<CSTColumn> objVecColumns;
//cout<<"Inside While Loop"<<endl;
EXEC SQL FETCH select_cursor INTO DESCRIPTOR 'out';

FETCH 语句为所有应用程序抛出错误。有时,选择查询会在引发错误之前运行多次。

引发错误的代码的 Cpp 部分是

short nIndex7=0;
int intVecIndex=0;
int LastIndex =0;
//EXEC SQL WHENEVER NOT FOUND DO BREAK ;
while(true)
{
memset(szDBErrorCode,'',DB_ERROR_LEN);
vector<CSTColumn> objVecColumns;
//cout<<"Inside While Loop"<<endl;
/* EXEC SQL FETCH select_cursor INTO DESCRIPTOR 'out'; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 13;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int  )1;
sqlstm.offset = (unsigned int  )822;
sqlstm.selerr = (unsigned short)1;
sqlstm.sqlpfmem = (unsigned int  )0;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char  *)&sqlca;
sqlstm.sqlety = (unsigned short)4352;
sqlstm.occurs = (unsigned int  )0;
sqlstm.sqfoff = (         int )0;
sqlstm.sqfmod = (unsigned int )2;
sqlcxt(&my_context, &sqlctx, &sqlstm, &sqlfpn); // This line gave the core
}

有人可以阐明这一点吗?

这似乎是一个真正的Oracle错误。在 18.1 中修复,但带有 12.2 的补丁

错误26911212:如果SQL分布在多个文件中,则PROC应用程序崩溃

具有您 - 和我们 - 遇到的症状:从Pro*C sqlctxt的下界区域深处对malloc/realloc的无效调用导致sigabrt((

补丁说明将此描述为预编译器错误,这意味着这可能是预编译器生成的代码中的问题,与我们的症状不匹配(我们实际上是在 12.1 上编译,但在 12.2 客户端上运行(。事实上,当你运行补丁时,是共享库 libclntshcore.so 等被修补,所以除非你静态链接,否则执行时客户端环境被破坏了,而不是预编译器环境。