DCOracle2中的分段错误Python的Oracle数据库绑定

时间:2016-03-29 05:54:09

标签: python oracle

目前我们正在使用DCORacle2 Oracle绑定Python。

DCOracle2不再维护,但由于传统的限制我们正在使用它。 每当我尝试使用任何更高的数据大小创建“SQLT_CLOB”时,它都会崩溃(分段错误)。

有了这个Python代码分段错误可以重现:

from DCOracle2 import DCOracle2,dbi

connection = DCOracle2.connect(user='username', password='password',database='DBname')
lob_locator = connection.LobLocator('SQLT_CLOB')
data = '1' * 90000
lob_locator.write(data)
connection.procedures.your_schema_name.your_procedure_name(lob_locator) # This line causes segmentation fault
connection.close()

这是我创建的简单程序:

create or replace function proceclob(i_clob clob) return clob as
l_tmp clob;
begin
  l_tmp := i_clob;
  return l_tmp;
end;

这是我在segfault之后可以看到的回溯:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff69f5d80 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) where
#0  0x00007ffff69f5d80 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x0000000000462e51 in PyString_FromStringAndSize ()
#2  0x00007ffff5da612f in listDescriptors (self=0x7ffff7e898f0, parmh=0x7ffff00ec768, entry=0x7ffff5fb0fa0, current=<optimized out>) at src/dco2.c:2293
#3  0x00007ffff5da69ea in ServerContext_describe (self=0x7ffff7e898f0, args=<optimized out>) at src/dco2.c:2425
#4  0x000000000056d4a4 in PyEval_EvalFrameEx ()
#5  0x000000000056dc92 in PyEval_EvalFrameEx ()
#6  0x000000000056dc92 in PyEval_EvalFrameEx ()
#7  0x00000000005747c0 in PyEval_EvalCodeEx ()
#8  0x00000000005697b0 in ?? ()
#9  0x000000000043a8b6 in PyObject_Call ()
#10 0x000000000043b626 in PyEval_CallObjectWithKeywords ()
#11 0x00000000004fdc2a in ?? ()
#12 0x000000000056d54e in PyEval_EvalFrameEx ()
#13 0x00000000005747c0 in PyEval_EvalCodeEx ()
#14 0x0000000000569ee1 in PyRun_FileExFlags ()
#15 0x000000000056a6b3 in PyRun_SimpleFileExFlags ()
#16 0x000000000056ba75 in Py_Main ()
#17 0x00007ffff68cd76d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#18 0x000000000041bb11 in _start ()

PS:这段代码与Python 2.6完美配合,但Python 2.7及以上版本崩溃。

我尝试用GDB调试python但找不到任何具体原因。我们使用的DCOracle2版本是1.3(最新)

如果可能,请提供任何提示。

1 个答案:

答案 0 :(得分:0)

我可以解决这个问题。 问题是: Oracle头文件在某些​​平台上将typedef'ub4'定义为'unsigned int',在某些平台上定义为'unsigned long int'。 在我的平台上,它将'ub4'定义为'unsigned int',这导致指针指向较大数据块的“Out of bounds”异常。