Подтвердить что ты не робот

Продолжить отладку в GHC после прерывания

У меня есть неисчерпаемое выражение в Haskell. Я хочу отлаживать и проверять причину, по которой она не заканчивается. Методика, которую я изучил, заключается в следующем: в GHCi:

:set -fbreak-on-exception
:trace nonterminating_expression
^C
:hist 50

Поэтому я могу видеть инструкции, которые выполняются в бесконечном вычислении. Проблема в том, что я хотел бы продолжить вычисление с помощью :step, игнорируя прерывание. Могу ли я это сделать?

Любые другие решения для отладки неисчерпающих вычислений? (История более 50 записей или другие методы, помогающие выполнить задачу.)

4b9b3361

Ответ 1

Одна вещь, которую я делал в прошлом, - это использовать unsafePerformIO для прерывания всякий раз, когда я нажимаю клавишу:

Скажем, т - ваше исходное выражение, вставьте x в выражение:

import System.IO
import System.IO.Unsafe

t  i = do print i;    t  (i+1)
t2 i = do print i; x; t2 (i+1)

x = do r <- hReady stdin
       if r then do a<-hGetChar stdin
                    print a -- break on this line
            else print "" 

Затем в приглашении ghci:

*Main> :break 9
*Main> t2 0

Нажмите клавишу клавиатуры

*Main> :cont

возобновляется, когда вы остановились.