调试 Python 中的内存问题

问题描述 投票:0回答:1

我有一个 Python 脚本,它使用相当数量的递归来处理相当数量的数据,但不会触发

MemoryError
RecursionError
。该脚本是否运行完成取决于其运行方式以及一些看似随机的机会。

  • 通过 PyCharm 运行:成功或停止并退出代码
    0xC0000005
    -2147483645
    或异常
  • 通过 CLI 运行:成功或因异常而停止或完全静默
  • 通过 CLI w/
    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 debugging memory
1个回答
0
投票

该问题可能与您的代码无关,而是 python 调试器的已知问题,例如: https://youtrack.jetbrains.com/issue/PY-54397/Debugger-crashes-when-breakpoint-is-inside-a-loop

就我而言,当我在断言行设置断点时,出现 0xC0000005 错误。上面的链接中提到的解决方法对我有帮助,即

PYDEVD_USE_CYTHON=NO
环境变量设置为我的运行/调试配置

我花了两天时间寻找根本原因。这可能真的很讨厌。

© www.soinside.com 2019 - 2024. All rights reserved.