python123平台崩溃_PyODBC Cursor.fetchall()导致python崩溃(segfault)

我有一个简单的python脚本,它使用pyodbc从AR数据库中获取数据,该数据库一直运行到今天.一旦光标到达特定行,我就会得到一个段错误.我在C中有类似的代码,检索结果没有问题,所以我认为这是pyodbc的一个问题.无论哪种方式,我都想“抓住”这个错误.我试图使用子进程模块,但它似乎没有工作,因为一旦脚本遇到段错误它只是挂起“python.exe遇到问题,需要关闭.”信息.我想我可以设置一些任意的时间框架来完成它,如果没有,强制关闭过程,但这似乎有点蹩脚.

@ paulsm4 – 我在下面回答了你的问题,谢谢!

Q: You’re on Windows/XP (32-bit, I imagine), Python 2.7, and BMC

Remedy AR. Correct?

答:是的,它在Win XP 32位和Win Server 2008 R2 64位上失败.

Q: Is there any chance you (or perhaps your client, if they purchased

Remedy AR) can open a support call with BMC?

答:可能不是……

Q: Can you isolate which column causes the segfault? “What’s

different” when the segfault occurs?

答:只是这一行…但我现在已将您的建议与以下问题隔离开来了.我使用循环来获取每个字段,直到发生段错误.

cursor.columns(table="mytable")

result = cursor.fetchall()

columns = [x[3] for x in result]

for x in columns:

print x

cursor.execute("""select "{0}"

from "mytable"

where id = 'abc123'""".format(x))

cursor.fetchall()

一旦我确定了导致段错误的列,我就尝试了对所有列的查询,除了那个列,确定它没有问题.

列的数据类型为CHAR(1024).我使用C来获取数据,并注意到该行的列中任何其他行中的字符数最多…… 1023!想到可能在PyODBC的C代码中有一个缓冲区正在写入超出其边界的范围.

2) Enable ODBC tracing: 07001

3) Post back the results (including the log trace of the failure)

好的,我已经创建了一个带有ODBC跟踪结果的pastebin – http://pastebin.com/6gt95rB8.为了保护无辜者,我屏蔽了一些字符串值.

看起来它可能是由于数据截断.

这是否为我们提供了有关如何解决问题的足够信息?我认为这是PyODBC中的一个错误,因为使用C ODBC API直接工作正常.

更新

所以我编译PyODBC进行调试,我收到了一条有趣的消息 –

Run-Time Check Failure #2 - Stack around the variable 'tempBuffer' was corrupted.

虽然我目前不了解它,但调用堆栈如下 –

pyodbc.pyd!GetDataString(Cursor * cur=0x00e47100, int iCol=0) Line 410 + 0xf bytes C++

pyodbc.pyd!GetData(Cursor * cur=0x00e47100, int iCol=0) Line 697 + 0xd bytes C++

pyodbc.pyd!Cursor_fetch(Cursor * cur=0x00e47100) Line 1032 + 0xd bytes C++

pyodbc.pyd!Cursor_fetchlist(Cursor * cur=0x00e47100, int max=-1) Line 1063 + 0x9 bytes C++

pyodbc.pyd!Cursor_fetchall(_object * self=0x00e47100, _object * args=0x00000000) Line 1142 + 0xb bytes C++

解决!

通过确保缓冲区有足够的空间来解决问题.

在第330行的getdata.cpp中

char tempBuffer[1024];

改成了

char tempBuffer[1025];

编译并替换了site-packages中的旧pyodbc.pyd文件,我们都很好!

谢谢你的帮助!

最佳答案 问:您使用的是Windows / XP(32位,我想象),

Python 2.7和

BMC Remedy AR.正确吗?

问:你有没有机会(或者你的客户,如果他们购买了Remedy AR)可以与BMC打开支持电话?

问:您能否隔离哪一列导致段错误?当发生段错误时“有什么不同”?

请执行以下操作:

1)使用Python / ODBC尝试不同的“选择a,b,c”语句,以查看是否可以重现问题(独立于您的程序)并隔离特定列(或理想情况下,特定列和行!)

3)回发结果(包括失败的日志跟踪)

4)如果这不起作用 – 如果你不能参与BMC技术支持 – 那么Plan B可能是在ODBC库级调试:

问:哪种C/C++编译器最适合您?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值