我有一个 Python 脚本,它使用相当数量的递归来处理相当数量的数据,但不会触发
MemoryError
或 RecursionError
。该脚本是否运行完成取决于其运行方式以及一些看似随机的机会。
0xC0000005
、-2147483645
或异常trace
运行:需要很长时间(因为所有的跟踪),但会成功上面提到的异常都是类似的:一个
TypeError
或 AttributeError
十几个左右调用了一个实际上并没有发生的递归链。例如,
TypeError: unsupported operand type(s) for |: 'function' and 'set'
其中左操作数是 never a
function
,特别是在有问题的调用中不是 function
,如调试器中所确认的。
所有这些疯狂的行为都指向令人讨厌的内存错误......某处(例如,
0xC0000005
是 Windows 访问冲突)。 Python 不是一种经常处理神秘内存问题的语言,除非有一个明显的低级库把事情搞砸了(这个脚本是纯 Python 的)。调试几乎是不可能的,因为调试器捕获了所有提到的异常,但没有提供它们如何蔓延的解释。并且不会出现失控的内存泄漏;该脚本现在正在运行(带有 trace
),占用空间稳定为 1.6 GB。
我发现其他答案表明 PyCharm 可能是罪魁祸首,实际上它的运行程序至少对提前终止负有部分责任,但即使是 CLI 也会产生奇怪的结果(为什么它会默默地停止?)。
trace
没有任何帮助,因为有了它,脚本就神奇地成功了,就好像一只警惕的眼睛吓得它屈服一样。
所以,所有这些都表明我不一定要寻求有关此特定脚本的帮助;没有必要让任何人其他去挖掘这个烂摊子。相反,我正在寻找 有关在 Python 中调试此类与内存相关的错误的建议,并且如果可以的话,还需要描述要查找的潜在原因。
事实证明,寻找有关这些东西的现有答案极其困难;例如,关于
0xC0000005
的问题几乎总是有像 PyTorch 这样的库作为嫌疑人。我尝试重新编写我的脚本,并且我认为我已经使其变得更加高效,但没有效果。这是一个非常特殊和令人讨厌的问题,但我确信我不是唯一遇到过这个问题的人。任何信息或找到它的地方将不胜感激。
该问题可能与您的代码无关,而是 python 调试器的已知问题,例如: https://youtrack.jetbrains.com/issue/PY-54397/Debugger-crashes-when-breakpoint-is-inside-a-loop
就我而言,当我在断言行设置断点时,出现 0xC0000005 错误。上面的链接中提到的解决方法对我有帮助,即
将
环境变量设置为我的运行/调试配置PYDEVD_USE_CYTHON=NO
我花了两天时间寻找根本原因。这可能真的很讨厌。