Отладка haskell: отображение имени функции при каждом вызове
Есть ли инструмент, который автоматически "маркирует" некоторые функции, чтобы я мог получить приближение "стека вызовов".
На самом деле, я хотел бы иметь поведение, подобное тому, которое вы получаете, написав fct = Debug.trace "fct" $ ...
, не добавляя его перед каждой функцией.
Я знаю, что профилирование делает что-то похожее на -fprof-auto, но мне нужно, чтобы он отображался во время работы приложения.
Некоторое время у меня бесконечные петли, и этот дисплей может сразу показать мне, какая функция неисправна. Использование hlist и breakpoints не очень полезно, поскольку вам уже нужно знать имя одной из функций цикла.
Ответы
Ответ 1
Вот что-то невероятно уродливое;-), и оно дает вам номер строки вместо имени функции, но я был удивлен, узнав, что он работает, поэтому я решил поделиться им. И это еще лучше, чем ничего. Вы можете использовать препроцессор C так же, как в старые добрые C дни:
{-# LANGUAGE CPP #-}
#define traceLoc trace (__FILE__ ++":"++ show __LINE__)
import Debug.Trace
f 0 = traceLoc $ 1
f n = traceLoc $ g (n-1)
g 0 = traceLoc $ 2
g n = traceLoc $ 2 * f (n-1)
Теперь
*Main> f 3
Test.hs:16
Test.hs:18
Test.hs:16
Test.hs:17
4