Python的DCOracle2 Oracle数据库绑定中的分段错误
目前,我们正在使用针对Python的Oracle绑定 DCOracle2不再维护,但由于传统的限制,我们正在使用它。 每当我试图创建具有更大数据量的“SQLT_CLOB”时,它就会崩溃(分段错误) 使用此Python代码分段可以重现错误:Python的DCOracle2 Oracle数据库绑定中的分段错误,python,oracle,Python,Oracle,目前,我们正在使用针对Python的Oracle绑定 DCOracle2不再维护,但由于传统的限制,我们正在使用它。 每当我试图创建具有更大数据量的“SQLT_CLOB”时,它就会崩溃(分段错误) 使用此Python代码分段可以重现错误: from DCOracle2 import DCOracle2,dbi connection = DCOracle2.connect(user='username', password='password',database='DBname') lob_lo
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 ()
程序接收信号SIGSEGV,分段故障。
0x00007ffff69f5d80英寸??()来自/lib/x86_64-linux-gnu/libc.so.6
(gdb)在哪里
#0 0x00007FF69F5D80英寸??()来自/lib/x86_64-linux-gnu/libc.so.6
#1 0x0000000000462e51在PyString_中来自StringAndSize()
#src/dco2.c处的列表描述符中有2个0x00007ffff5da612f(self=0x7ffff7e898f0,parmh=0x7ffff00ec768,entry=0x7ffff5fb0fa0,current=)
#在src/dco2.c:2425处描述ServerContext中的3 0x00007ffff5da69ea(self=0x7ffff7e898f0,args=)
#PyEval_EvalFrameEx()中的4 0x000000000056d4a4
#PyEval_EvalFrameEx()中的5 0x000000000056dc92
#PyEval_EvalFrameEx()中的6 0x000000000056dc92
#PyEval_evalcodex()中的7 0x00000000005747c0
#8 0x00000000005697b0英寸??()
#PyObject_调用()中的9 0x000000000043a8b6
#PyEval_CallObjectWithKeywords()中的10 0x000000000043b626
#11 0x00000000004fdc2a英寸??()
#PyEval_EvalFrameEx()中的12 0x000000000056d54e
#PyEval_evalcodex()中的13 0x00000000005747c0
#PyRun_FileExFlags()中的14 0x0000000000569ee1
#15 0x000000000056a6b3在PyRun_SimpleFileExFlags()中
#Py_干管中的16 0x000000000056ba75()
#17 0x00007ffff68cd76d,位于/lib/x86\u 64-linux-gnu/libc.so.6中的
#18 0x000000000041bb11英寸(U开始)
PS:这段代码与Python2.6完美配合,但在Python2.7及以上版本中崩溃
我尝试过用GDB调试python,但找不到任何具体原因。我们使用的DCOracle2版本是1.3(最新版本)
如果可能,请提供任何提示。我可以解决这个问题。
问题是:
Oracle标头在某些平台上将typedef“ub4”定义为“unsigned int”,在某些平台上将“unsigned long int”。
在我的平台上,它将“ub4”定义为“unsigned int”,这导致指针指向较大数据块时出现“越界”异常