1

我在我的 C 代码中使用以下函数连接到 oracle 数据库。以下功能有时会导致分段错误,而在其他时间工作

static int Connect(char *string)
{
EXEC SQL BEGIN DECLARE SECTION;
    static char login[80];
EXEC SQL END DECLARE SECTION;

    strcpy((char *)login, string);

    EXEC SQL CONNECT :login ;

    if (sqlca.sqlcode < 0) 
        return(-1);
    return(0);
}

下面是使用核心文件生成的调试器报告。对此有任何建议。

program terminated by signal SEGV (no mapping at the fault address)
0xffffffffffffffff:     <bad address 0xffffffffffffffff>
Current function is Connect
    375    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);

  [20] 0xffffffff7e587078(0x0, 0x100210f80, 0xffffffff7fffc850, 0x1000e4dd0, 0xff000000000000, 0x8080808080808080), at 0xffffffff7e587078
=>[21] login(orastring = 0xffffffff7fffcef8 "user123/abcd@sunn.adams"), line 375 in "connect.c"
4

2 回答 2

0

有很多类似的问题(使用 Oracle 8.1.7),我在网上找到的大部分内容只是简单地说:Oracle Bug(特别是如果 sqlcxt 最终调用 lxchcsn

我有一个运行 25 个线程的程序,它似乎可以工作。我更改了一些设置,这意味着数据库调用频率的增加,这个问题开始发生。当我在数据库调用周围放置互斥锁时,问题就消失了(这很奇怪,因为我可以看到 25 个单独的数据库连接——每个线程都有自己的上下文)——并且放入互斥锁有点违背了多线程的目的。

基本上,我认为这是一个 Oracle 问题

于 2012-04-10T01:10:46.577 回答
0

从调试器报告中,seg 错误是因为访问不可访问的内存。

我会建议两个地方进行检查。(a) 在使用前检查输入参数'string'NULL值。(b) 使用strncpy()代替strcpy()

于 2011-03-11T23:25:00.930 回答