Beim Spielen mit verschiedenen Algorithmen in Haskell passiert es mir oft, dass ich ein Programm mit einem Speicherleck erstelle, wie es oft bei fauler Auswertung passiert. Das Programm, das all die Erinnerung aufnimmt, macht nicht wirklich Spaß, ich habe oft Schwierigkeiten, es zu töten, wenn ich es zu spät erkenne.Wie kann ich vor GHC7-kompilierten Programmen schützen, die den gesamten Speicher belegen?
Bei Verwendung von GHC6 hatte ich einfach export GHCRTS='-M384m'
in meinem .bashrc
. Aber in GHC7 haben sie security measure hinzugefügt, es sei denn, ein Programm wird kompiliert mit -rtsopts
, es scheitert einfach, wenn es eine RTS-Option entweder in einem Befehlszeilenargument oder in GHCRTS
gegeben wird. Leider werden fast keine Haskell-Programme mit diesem Flag kompiliert, so dass das Setzen dieser Variablen alles zum Scheitern bringt (wie ich in After upgrading to GHC7, all programs suddenly fail saying "Most RTS options are disabled. Link with -rtsopts to enable them." entdeckte).
Irgendwelche Ideen, wie man Gebrauch von GHCRTS
mit GHC7 macht, oder eine andere bequeme Weise, wie man verhindert, dass meine Programme den ganzen Speicher nehmen?
Es gibt natürlich Lösungen unabhängig von Haskell, nur die Speicherauslastung bestimmter Prozesse zu begrenzen. Ist das ein Linux? - Aber warum benutzt du nicht "-rtsopts" für ein Programm, von dem du weißt, dass es speicherkritisch ist? – leftaroundabout
@leftaroundabout Was er sagt, ist, dass er die Option 'M384M' standardmäßig für seine eigenen Programme aktiviert, indem er die 'HHCRTS'-Umgebungsvariable verwendet, aber jetzt kann er es nicht mehr, weil andere Haskell-Tools (wie zB , 'cabal-dev') wird fehlschlagen, wenn ein' RTS'-Parameter gegeben wird. –
Unter Linux können Sie 'ulimit -m' verwenden, um die Anzahl der von einer Shell gestarteten Speicherprozesse zu begrenzen. Andere * nixe haben wahrscheinlich einige Variationen der ulimit-Schalter, die sie akzeptieren. – ninjalj