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

2024-04-27 04:06:52 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我们正在为Python使用DCORacle2Oracle绑定。你知道吗

DCOracle2不再维护,但是我们使用它是因为遗留的限制。 每当我试图用更大的数据量创建'SQLT\u 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:这段代码在Python2.6上运行得非常好,但在Python2.7及更高版本上会崩溃。你知道吗

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

如果可能,请提供任何提示。你知道吗


Tags: infromgnulinuxlibconnectiontmpx86
1条回答
网友
1楼 · 发布于 2024-04-27 04:06:52

我可以解决这个问题。 问题是: Oracle标头将typedef“ub4”在某些平台上定义为“unsigned int”,在某些平台上定义为“unsigned long int”。 在我的平台上,它将“ub4”定义为“unsigned int”,这导致指针指向较大数据块时出现“越界”异常。你知道吗

相关问题 更多 >