yupeqiu 发表于 2012-01-27 18:27

有哪位高手知道为什么程序在获取ORA连接之后程序异常为什么不有产生CORE文件?

程序代码如下:
int QueryServ()
{
        Environment* env = Environment::createEnvironment(Environment::THREADED_MUTEXED);
        Connection* conn = env->createConnection("user", "pwd", "org11g");
        Statement* stmt = 0x00;
        ResultSet* ds   = 0x00;
        string sql = "select serv_id from serv where serial = :v1";
       

        // 此处发出SIGABRT信号,应该程序在此处退出并产生CORE文件
        abort();

       
        try
        {
                printf("Exec query!\n");
                stmt = conn->createStatement(sql);
                stmt->setNumber(1, 2043127780);
                ds = stmt->executeQuery();
                while (ds->next()) {
                        long serv_id = ds->getNumber(1);
                        printf("serv_id = %ld!\n", serv_id);
                }
        }
        catch(SQLException &ex){
                printf("catch error is : %s!", ex.what());
                return -1
        }
       
stmt->closeResultSet(ds);
conn->terminateStatement(stmt);
return 0;
}

但是程序运行的结果是:
1、程序退出字符串Exec query没有打印,也没有core文件产生。按现理说abort()会发出SIGABRT信号导致程序退出并且有core文件产生。
2、而将abort()函数放至Connection* conn = env->createConnection("user", "pwd", "org11g");处理前则会退出并且产生core文件!

引出的问题是为什么使用ORACLE函数接口获取了一个数据库连接之后为什么不会产生core文件?
在网上查询了一些资料说ORACLE的sqlnet.ora配置文件里的BEQUEATH_DETACH参数是控制信号捕获的开关,如下:

1.BEQUEATH_DETACH

bequeath_detach

The default is NO (turn signal handling on). By setting BEQUEATH_DETACH=YES, Oracle turns off its own signal handlers and pass all child processes over to the UNIX init process (pid = 1). The init process will take over responsibility to checks for "defunct" child processes and terminate them.

Instead of setting this parameter in the sqlnet.ora file, consider setting it as an environment variable before starting applications that use signal handlers that could interfere with SQL*Net. Example:
export BEQUEATH_DETACH=YES


针对上面的解说:
1、上在的代码不变,修改sqlnet.ora参数为YES并重启数据库的监控,执行应该是不会产生CORE文件;
2、使用上面说的替代方式在环境变量中添加export BEQUEATH_DETACH=YES重新执行程序,依然没有产生core,感觉信号依然被oracle给捕获了。
3、在另外一台AIX主机上执行上面的代码,而且SQLNET.ORA和环境变量也没有设置的,却core出来了。

现在的疑问是:
1、为什么在HP主机上只要获取了一个ORACLE连接,程序如何都CORE不出来?这是否因为ORACLE将信号捕获了的原故还是其他?
2、如果是ORACLE把信号捕获了,那为什么设置BEQUEATH_DETACH不起作用?是否是使用别的参数或什么方式,请哪个高手高手高高手指点一下!
3、为什么同样的代码AIX上却能CORE出来?难道ORACLE在两个平台的处理存在差异?

请各位高手~指教一下~~~

看过想知道结果的请路过的兄弟姐妹们帮顶一下~~~!

cow977 发表于 2012-02-02 16:55

不懂,帮顶。
页: [1]
查看完整版本: 有哪位高手知道为什么程序在获取ORA连接之后程序异常为什么不有产生CORE文件?