Debugging 有没有办法限制ghci的内存?

Debugging 有没有办法限制ghci的内存?,debugging,haskell,memory-management,ghc,ghci,Debugging,Haskell,Memory Management,Ghc,Ghci,我习惯于使用ghci调试代码。通常会发生类似的情况(当然不是很明显): 然后,一段时间内什么也没发生,如果我反应不够快,ghci已经吃掉了大约2GB的RAM,导致我的系统冻结。如果为时已晚,解决此问题的唯一方法是[ALT]+[PRINT]+[K] 我的问题:有没有一种简单的方法来限制ghci可以消耗的内存,比如说1GB?如果超过限制,则应中止计算或终止ghci。在设置了ulimit-m的shell下运行它是一种相当简单的方法。如果您想定期运行一些限制,可以在运行ghci之前创建一个包装器脚本,该

我习惯于使用ghci调试代码。通常会发生类似的情况(当然不是很明显):

然后,一段时间内什么也没发生,如果我反应不够快,ghci已经吃掉了大约2GB的RAM,导致我的系统冻结。如果为时已晚,解决此问题的唯一方法是[ALT]+[PRINT]+[K]


我的问题:有没有一种简单的方法来限制ghci可以消耗的内存,比如说1GB?如果超过限制,则应中止计算或终止ghci。

在设置了
ulimit-m
的shell下运行它是一种相当简单的方法。如果您想定期运行一些限制,可以在运行
ghci
之前创建一个包装器脚本,该脚本不执行
ulimit
,实现这一点的独立于平台的方法是向Haskell运行库提供
-M
选项as on,如下所示

ghci +RTS -M1m
有关详细信息,请参阅

现在,
ghci
输出如下所示:

>ghci +RTS -M10m
GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let f@(_:x) = 0:1:zipWith(+)f x
Prelude> length f
Heap exhausted;
Current maximum heap size is 10485760 bytes (10 MB);
use `+RTS -M<size>' to increase it.
ghci+RTS-M10m GHCi,6.12.3版:http://www.haskell.org/ghc/ :? 求救 正在加载程序包ghc prim。。。链接。。。完成。 正在加载包整型gmp。。。链接。。。完成。 正在加载包库。。。链接。。。完成。 正在加载包ffi-1.0。。。链接。。。完成。 前奏曲>设f@(x:x)=0:1:zipWith(+)fx 前奏曲>长度f 堆耗尽; 当前最大堆大小为10485760字节(10MB); 使用“+RTS-M”增加它。
这不起作用。我尝试了类似于
ulimit-m102400
的东西,但它仍然会消耗内存。@hobbs@fuzzxl您应该使用
ulimit-v
,而不是
ulimit-m
-m
开关限制物理内存,而您需要限制虚拟:物理+交换。我使用
ulimit-v$((1024**2)*2))
(zsh)和4gib RAM+5gib交换,它不会冻结系统。这将内存量限制为2 GiB,可以放入
~/.zshrc
~/.bashrc
中。谢谢。我发现这样做没有多大帮助,因为我以后无法再次更改shell中的值。(只有向下…@fuzzxl为什么不能?我对此没有问题(或者你的意思是你不能从GHCi更改它?)。它可能不太有用,因为当进程内存不足时,它可能会捕获SEGV并崩溃,但GHCi会正常处理。zsh中有一些相关的有用特性:如果某个修改tty设置的应用程序(例如vim)崩溃,那么屏幕上就会出现一团乱麻,并且一些键无法工作。Zsh内置
ttyctl
和参数
-f
可以防止这种情况。我的意思是:首先,我做一些类似于
ulimit-v 102400的事情,然后-在ghci之后-我想撤销:
ulimit-v unlimited
,但是我得到了一个权限错误。我刚刚在
~/.bashrc
中创建了一个别名
别名ghci='ghci+RTS-M500m-RTS'
,现在一切正常。非常感谢。我想您也可以使用您的
.ghci
文件?实际上,当达到限制时,这不会中止,因此这不是一个解决方案。此外,ghci仍然使用比所述更多的内存。例如,我有
4Gb
的RAM,我将其设置为
-M100m
。它告诉我它被设置为
100Mb
,这完全没问题,但是当我运行
fib 100000
时,程序仍然会冻结我的机器。它不像以前那样完全冻结它,但内存几乎已满,交换空间已满,导致大量IO,使系统在两分钟或更长时间内无法使用。@Zelphir适用于我的GHCi-8.0.1。可能是一个已经修复的bug。您可以使用stack安装它,并制作别名,例如
alias ghci512=“stack ghci--ghci选项'+RTS-M512m-RTS'
。如果您在项目中使用堆栈,我建议您还是坚持使用它的ghci,以避免在RAM中复制库和文件缓存。GHC允许您控制堆的最大和建议大小、堆栈大小以及垃圾收集器的分配区域。另请参阅
>ghci +RTS -M10m
GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let f@(_:x) = 0:1:zipWith(+)f x
Prelude> length f
Heap exhausted;
Current maximum heap size is 10485760 bytes (10 MB);
use `+RTS -M<size>' to increase it.