不可能的Python错误

时间:2012-11-03 00:31:34

标签: python heisenbug

所以我有foo,普通花车的普通元组。在我的脚本中调用地图是莫名其妙地抛出所有事情的Numpy错误,即使代码没有任何问题。进入调试器并执行完全相同的代码不会产生预期的错误。有谁知道会发生什么?我完全失去了。这怎么可能?

另外,对于那些要求最小脚本来重现问题的人:我无法使用短片段重现它,并且我无法发布整个脚本,因为它是用于家庭作业。

Traceback (most recent call last):
  File "py_code\ps4-code.py", line 240, in <module>
    doPairMatch(transA, transB, tapoints, tbpoints, 1, ransacTranslate)
  File "py_code\ps4-code.py", line 217, in doPairMatch
    print map(int, foo)
TypeError: expected a single-segment buffer object
>>> import pdb;pdb.pm()
> c:\homework\cs4495\ps4\py_code\ps4-code.py(217)doPairMatch()
-> print map(int, foo)
(Pdb) print foo
(603.0, 437.0)
(Pdb) print map(int, foo)
[603, 437]
(Pdb) print type(foo)
<type 'tuple'>
(Pdb) print int, map, type
<type 'int'> <built-in function map> <type 'type'>
(Pdb) map(type, foo)
[<type 'float'>, <type 'float'>]
(Pdb)

编辑:至少我知道这是怎么回事。看起来问题是在垃圾收集期间发生的,这就是为什么错误随机出现在代码的不相关部分中。据推测,gc在OpenCV中的某处触发了一个错误,导致一切崩溃。

Exception TypeError: 'expected a single-segment buffer object' in 'garbage colle
ction' ignored
Fatal Python error: unexpected exception during garbage collection

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

1 个答案:

答案 0 :(得分:1)

我从不同的原因知道这种异常:一个有缺陷的C扩展模块(OpenCV?)。如果在从该模块执行某个C函数期间引发TypeError,但模块缺少用于检测它的代码,那么它可以在执行C函数之后保持未检测到。它会突然显示出来。

我无法知道我是否正确,但如果在“map(int,foo)”之前有几行调用这样的C扩展模块,那么一个好的指标就是。确切知道的一种方法是在“map(int,foo)”之前放置另一行来检测一个留下的异常。事实证明,它可以是例如“all([])”。如果你在“all([])”行上得到TypeError,那么显然它是一个遗留的异常。