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

标签 c++ debugging select gdb oracle12c

在 172.19.112.43 服务器上运行某些应用程序时,oracle 导致应用程序崩溃。 Oracle 12.2 版,Linux 版 - Red Hat Enterprise Linux Server 6.0 版(圣地亚哥)。

请在下面找到崩溃痕迹:

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=FALSE

DIAG_DDE_ENABLED=FALSE

但即使这样也无济于事。抛出此错误的代码是:

    short nIndex7=0;
    int intVecIndex=0;
    int LastIndex =0;
    while(true)
    {
    memset(szDBErrorCode,'\0',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,'\0',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 等等被打补丁的,所以除非你静态链接它是被破坏的执行时客户端环境,而不是预编译器环境。

关于c++ - Proc*C 应用程序在 Oracle 12.2 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084659/

相关文章:

c++ - 是否可以在Windows XP下用普通的C++程序覆盖代码段?

c# - T4 模板仅在我将它们设置为 "Debug"时运行

c++ - 运算符 << 重载

c++ - __sync_bool_compare_and_swap 编译器标志和包含

c++ - 在使用工厂模式时,我是否应该以任何方式避免向下转换?

mysql - SELECT JOIN WHERE 查询的最佳实践

c# - 从表中选择,然后将 (value + 1) 插入到另一个表中?

C++,我可以禁止特定的策略组合吗?

ios - 尝试在 Swift 中打印表情符号时打印额外的 unicode

sql - PostgreSQL 在选择查询中使用 CASE WHEN