小编And*_*eas的帖子

如何增加ruby应用程序的堆栈大小.递归应用程序获取:堆栈级别太深(SystemStackError)

在stackoverflow.com上发布堆栈溢出问题,有多么有趣:-)

我正在运行一些递归的Ruby代码,我得到: "Stack level too deep (SystemStackError)"

(我很确定代码是有效的,我不是在无限的递归死亡螺旋中,但这不是重点)

有没有改变我的Ruby应用程序允许的堆栈深度/大小?

如果这是Ruby中的限制,我不太明白,因为错误说"堆栈级别",这让我觉得Ruby以某种方式计算堆栈的"级别",或者它只是意味着堆栈已满.

我试过在Vista和Ubuntu下运行这个程序,结果相同.在Ubuntu下我尝试用'ulimit -s'将堆栈大小从8192更改为16000,但这并没有改变任何东西.

编辑:感谢您的反馈.
我确实意识到使用递归函数可能不是最强大的方法.但这也不是重点.我只是想知道是否有办法增加堆栈大小..期间.正如我所提到的,我确实尝试在运行ruby脚本之前运行ulimit -s 16000 ..没有任何改进..我使用它错了吗?

Edit2:事实上我在代码的边缘情况下有一个无限递归.
当您收到"Stack level too deep"错误时,截断的ruby堆栈跟踪有点误导.
当具有涉及多个函数的递归行为时,您会得到递归数量远低于其实际值的印象.在这个示例中,可能会在超过190次调用后崩溃,但实际上大约有15000次调用

tst.rb:8:in `p': stack level too deep (SystemStackError)
        from tst.rb:8:in `bar'
        from tst.rb:12:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
         ... 190 levels...
        from tst.rb:19:in `foo'
        from tst.rb:10:in `bar'
        from tst.rb:19:in `foo'
        from tst.rb:22
Run Code Online (Sandbox Code Playgroud)

-Andreas

ruby recursion

34
推荐指数
4
解决办法
2万
查看次数

如何保留自己的调试行而不检查它们?

在处理某些代码时,我添加了某种额外的调试日志记录,以便我更容易跟踪我关心此特定修复的状态和值.

但是,如果我将其检入源代码存储库,我的同事会因为污染Log输出并污染代码而生我的气.

那么我如何在本地保留这些对我来说很重要的代码行而不进行检查呢?

澄清: 许多答案与日志输出相关,并且您具有日志级别可以过滤掉它.我同意这一点.

但.我还提到了污染实际代码的问题.如果有人在每隔一行代码之间放置一条日志语句,则始终打印所有变量的值.它确实使代码难以阅读.所以我真的想避免这种情况.基本上没有检查日志代码.所以问题是:如何保留自己的专用日志行.因此,您可以将它们用于调试版本,而不会使签入的代码混乱.

debugging version-control logging

6
推荐指数
1
解决办法
560
查看次数

标签 统计

debugging ×1

logging ×1

recursion ×1

ruby ×1

version-control ×1