debugger debug debugging haskell infinite-loop

debugging - debug - Encontrando donde<<bucle>> sucedió



debug in haskell (2)

Si obtenemos un <<loop>> , significa que Haskell había logrado detectar un bucle infinito. ¿Hay alguna manera de que ghc nos diga dónde ocurrió este bucle? Parece que Haskell debería tener esta información en algún lugar.


Además de lo que ya se ha escrito: estos bucles solo se detectan en tiempo de ejecución . La detección se basa en el código que intenta evaluar un valor que ya está siendo evaluado [por el mismo hilo]. Claramente eso nunca debería suceder.

Si está buscando un conmutador de compilación para detectar esto en tiempo de compilación ... no tiene suerte. Es bastante fácil detectar estáticamente la recursión, pero decidir si la recursión es infinita o no no es tan fácil.


Compile su aplicación con -prof y -fprof-auto (si está usando Cabal, use --enable-executable-profiling y --ghc-options=-fprof-auto ) y luego ejecútelo con +RTS -xc . Se imprimirá un seguimiento de la pila cuando se producen errores. Esto debería ayudarte a reducir tu alcance.

Ejemplo:

➜ haskell cat loop.hs myFun :: Int myFun = let g = g + 1 in g + 10 main = print myFun ➜ haskell ghc loop.hs -prof -fprof-auto [1 of 1] Compiling Main ( loop.hs, loop.o ) Linking loop ... ➜ haskell ./loop +RTS -xc *** Exception (reporting due to +RTS -xc): (THUNK_STATIC), stack trace: Main.myFun.g, called from Main.myFun, called from Main.CAF *** Exception (reporting due to +RTS -xc): (THUNK_STATIC), stack trace: Main.myFun.g, called from Main.myFun, called from Main.CAF loop: <<loop>>