我在我的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"
答案 0 :(得分:0)
从调试器报告中,seg fault是因为访问不可访问的内存。
我建议两个地方进行一些检查。
(a)在使用之前检查'string'
值的输入参数NULL
。
(b)使用strncpy()
代替strcpy()
答案 1 :(得分:0)
有很多类似的问题(使用Oracle 8.1.7),我在'net上发现的大部分内容都说:Oracle Bug(特别是如果sqlcxt最终调用lxchcsn
我有一个程序运行25个线程似乎工作。我更改了一些设置,这意味着DB调用频率的增加,这个问题开始发生。当我在数据库调用周围放置互斥锁时,问题就消失了(这很奇怪,因为我可以看到25个单独的数据库连接 - 每个线程都有自己的上下文) - 并且放入互斥锁会使多线程的目的失败。 / p>
基本上,我认为这是一个Oracle问题