BSD-3-Clause licensed and maintained by Neil Mitchell
This version can be pinned in stack with:debug-0.0.2@sha256:359a2dc9c70292a732d8baf4035a6068bad656408ed4a952d31f3adb9c8c3e9b,1618

Module documentation for 0.0.2

Haskell Debugger Hackage version Stackage version Linux Build Status Windows Build Status

A library for debugging Haskell programs. To use, take the functions that you are interested in debugging, e.g.:

module QuickSort(quicksort) where
import Data.List

quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = quicksort lt ++ [x] ++ quicksort gt
    where (lt, gt) = partition (<= x) xs

Turn on the TemplateHaskell and ViewPatterns extensions, import Debug, indent your code and place it under a call to debug, e.g.:

{-# LANGUAGE TemplateHaskell, ViewPatterns #-}
module QuickSort(quicksort) where
import Data.List
import Debug

debug [d|
   quicksort :: Ord a => [a] -> [a]
   quicksort [] = []
   quicksort (x:xs) = quicksort lt ++ [x] ++ quicksort gt
       where (lt, gt) = partition (<= x) xs
   |]

We can now run our debugger with:

$ ghci QuickSort.hs
GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling QuickSort        ( QuickSort.hs, interpreted )
Ok, 1 module loaded.
*QuickSort> quicksort "haskell"
"aehklls"
*QuickSort> debugView

The call to debugView starts a web browser to view the recorded information, looking something like:

Debug view output

Limitations

This tool is quite new, so it has both limitations, places it is incomplete and bugs. Some notable issues:

  • It calls show on all the values in encounters, meaning they must all have a Show instance (it defines a global Show instance which should get used as a fallback), and they will be fully evaluated. If your program relies on laziness it probably won’t work.
  • It doesn’t really understand shadowed variables, so it will work, but the debug results will be lower quality.
  • For function values it won’t give you a whole lot of information.

Alternatives

For practical alternatives for debugging Haskell programs you may wish to consider:

  • GHCi debugger, simple imperative-style debugger in which you can stop a running computation in order to examine the values of variables. The debugger is integrated into GHCi. Robust, reliable, somewhat difficult to use.
  • Hood and Hoed, a value-based observational debugger with a difficult user interface, deals well with laziness.
  • Hat, good ideas, but I’ve never got it working.

Compared to the above, debug stresses simplicitly of integration and user experience.

FAQ

Q: debugView fails talking about Wine?

A: If you get wine: invalid directory "/home/f/.wine" in WINEPREFIX: not an absolute path when running debugView that means xdg-open is handled by Wine. Fix that and it will work once more.

Changes

Changelog for Debug

0.0.2, released 2017-12-18
#6, don't generate context for obviously-monadic things
Make debugPrint a bit nicer
0.0.1, released 2017-12-18
Make debugView work on Linux
0.0, released 2017-12-15
Initial version