Search code examples
debugginghaskellmemory-managementghcghci

Is there a way to limit the memory GHCi can have?


I'm used to debug my code using GHCi. Often, something like this happens (not so obvious, of course):

ghci> let f@(_:x) = 0:1:zipWith(+)f x
ghci> length f

Then, nothing happens for some time, and if I don't react fast enough, GHCi eats maybe 2 GB of RAM, causing my system to freeze. If it's too late, the only way to solve this problem is [ALT] + [PRINT] + [K].

My question: Is there an easy way to limit the memory which can be consumed by GHCi to, let's say, 1 GB? If limit is exceed, the calculation should be aborted or GHCi should be killed.


Solution

  • A platform independant way to accomplish this is to supply the -M option as on option to the Haskell runtime like this

    ghci +RTS -M1m
    

    see the GHC documentation’s page on how to control the RTS (runtime system) for details.

    The ghci output now looks like:

    >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.