Python3中的递归日志崩溃解释器

Python3中的递归日志崩溃解释器,python,python-3.x,logging,python-3.6,cpython,Python,Python 3.x,Logging,Python 3.6,Cpython,下面的代码记录了一个错误并调用自身,导致堆栈溢出,最终导致Python3.6中的核心转储 >>> import logging >>> def rec(): ... logging.error("foo") ... rec() >>> rec() [1] 101641 abort (core dumped) python3 FTR,这不会使Python 2.7崩溃 在Python 3.6中附加错误(压缩): ERR

下面的代码记录了一个错误并调用自身,导致堆栈溢出,最终导致Python3.6中的核心转储

>>> import logging
>>> def rec():
...     logging.error("foo")
...     rec()
>>> rec()

[1]    101641 abort (core dumped)  python3
FTR,这不会使Python 2.7崩溃

在Python 3.6中附加错误(压缩):

ERROR:root:foo
...
--- Logging error ---
Traceback (most recent call last):
...
RecursionError: maximum recursion depth exceeded in comparison
...
Fatal Python error: Cannot recover from stack overflow.
...
[1]    101641 abort (core dumped)  python3
Python 2.7:

RuntimeError: maximum recursion depth exceeded
但是在Python2.7中没有核心转储

FTR,如果日志级别设置为logging.error,则Python 3.6的上述错误将起作用。对于其他日志级别也是如此


更新:我已登录Python社区跟进此事。

您的代码最终将导致运行时错误(Python2.7)或递归错误(Python3.6)。这是因为两者中的递归深度都限制为1000:

>>>import sys
>>>sys.getrecursionlimit()
1000

如果它实际上导致了堆栈溢出导致的崩溃,一个可能的原因是递归深度限制已被修改。

没有停止条件-我在Python 2.7中的测试达到了最大递归深度。在Python3中,我猜调用堆栈将溢出,但我不是很确定。@TobiasBrösamle您当然是对的。我对OP的声明感到惊讶,它没有使Python 2.7崩溃。还有3次向上投票…@TobiasBrösamle是的,没有停止条件,这是有意重现错误的。我还附加了这些错误以供参考。@ElmoVanKielmo我同意,但Python解释器允许从该异常中恢复,在这个特定示例中不是这样。(因此,这篇文章的实用性是什么?@SaimRaza我想建议你直接向CPython开发者报告一个bug,但你已经报告了,而且你似乎成功了——做得很好——现在就投票表决你的问题!我检查了递归限制,在两个版本中都设置为1000。