2013-07-18 3 views
3

Я написал программу haskell, которая делает вещи на 10000 вещах. Теперь, просто черт возьми, я побежал с миллионом и получил stack space overflow.Как диагностировать переполнение стека в haskell

Мне известно о проблеме сложения/складки и проблемах, которые могут быть вызваны лень, но в настоящее время я не знаю, какой фрагмент моего кода вызывает это.

Что такое хороший способ атаковать такие проблемы?

+2

Настоящий мир Haskell имеет главу о просачивании пространства утечки: http://book.realworldhaskell.org/read/profiling-and-optimization.html – cdk

+0

Возможный дубликат [Возможно ли использовать профилирование пространства в Haskell] (http : //stackoverflow.com/questions/12426266/is-it-possible-to-profiling-space-usage-in-haskell) – cdk

ответ

1

Я нашел модуль Debug.Trace полезным для таких вещей. Не видя ни одного из ваших кодов, трудно дать полезный пример, но если вы посмотрите на эту документацию, вы, вероятно, найдете что-то, что поможет.

В противном случае я бы рассмотрел ваш код для нерегулярных рекурсий, которые могли бы заполнить стек вызовов.

+3

Рекурсия без хвоста - это не единственное, что может вызвать переполнение стека в Haskell. Мы также должны искать «thunk buildup» (который, к сожалению, может быть более тонким) – luqui

+0

Кто мог бы забыть о thunks? +1 Но я действительно думал, что трюки пошли в кучу, а не в стек. – Nigel

+0

Они выделяются в куче, но стек используется при их оценке. – luqui

Смежные вопросы