进程以退出代码 -1073741571 结束

Posted

技术标签:

【中文标题】进程以退出代码 -1073741571 结束【英文标题】:Process finished with exit code -1073741571 【发布时间】:2014-01-04 21:54:06 【问题描述】:

我有一个寻找欧拉路径的递归函数。我不认为函数的定义是相关的(但如果有人这么认为,我也会粘贴它)。

问题是当我使用大图运行函数时,我收到以下众所周知的错误:RuntimeError: maximum recursion depth exceeded in cmp

即使没有上述问题,我知道我需要使用以下命令增加递归限制

import sys
sys.setrecursionlimit(5000)

问题是,无论我使用什么数字,我都会遇到最大递归错误,或者我的程序只是停止,屏幕上没有输出,但是:。我试图用谷歌搜索这段代码,我能找到的唯一问题是 Ruby 中的问题。知道如何克服这个问题。

如果这是相关的,我使用的是 Windows 8 64 位,我有足够的 RAM,我有 64 位 python。

由于某种原因,这个问题最近受到了一些关注,我想强调我无法找到问题的解决方案。在绝望地尝试解决问题后,我放弃了并在没有递归的情况下重写了它。这也很烦人,但我花在重写整个算法上的时间比我花在研究这个问题上的时间要少得多。我还想提一下,我没有以前的递归代码,所以我将无法复制问题。

【问题讨论】:

您的程序可能需要一些优化? CPython 没有优化尾递归,所以尽量避免使用到这种程度。 图中有多少条边? @thefourtheye 那里没有什么可以优化的。唯一需要优化的是将递归更改为 while 循环 :-) 可能您正在尝试将限制设置为大于环境允许的范围。这会导致 setrecursionlimit '不适合你'。 【参考方案1】:

这是微软“堆栈溢出/堆栈耗尽”错误代码 0xC00000FD 的有符号整数表示。

您可以尝试增加可执行文件的堆栈大小,如以下答案所述:How to overcome Stack Size issue with Visual Studio (running C codes with big array)

每当您在 Windows 中看到奇怪的、大的负退出代码时,将它们转换为十六进制,然后在 ntstatus 错误代码 http://msdn.microsoft.com/en-us/library/cc704588.aspx 中查找它们

您也可以使用MS Error Lookup Tool 在本地甚至自动查找此类代码。 Microsoft 和第三方都存在其他类似的工具。

【讨论】:

这应该是公认的答案,它是正确的。认为重要的是要提到您检查有符号整数的DWORD(32 位)值。如果您不小心将其转换为 QWORD(Windows Calc 中的默认值),它将在左侧填充 FFFF FFFF(或者您可以删除它们,其余的将是正确的值)。【参考方案2】:

你可以使用类似的东西:

if __name__ == '__main__':
    sys.setrecursionlimit(100000)
    threading.stack_size(200000000)
    thread = threading.Thread(target=your_code)
    thread.start()

这解决了我的递归限制和堆大小限制。

【讨论】:

这消除了直接的症状,这有时很好;但它不会解决所有递归问题。特别是,如果你有一个无限递归,无论堆栈有多大,你都会用完堆栈。

以上是关于进程以退出代码 -1073741571 结束的主要内容,如果未能解决你的问题,请参考以下文章

如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?

进程以退出代码 1 Spring Boot Intellij 结束

进程以退出代码 -1073741515 (0xC0000135) 结束

这是啥错误,我该如何解决?进程以退出代码 -1073740791 (0xC0000409) 结束

进程以退出代码 139 结束(被信号 11 中断:SIGSEGV)

模拟器:进程以退出代码 -1073741515 (0xC0000135) 结束