2009-03-23 15 views
31

Ho usato il debugger ghci ma preferirei davvero se fosse un po 'integrato con un editor di testo per semplificare il processo di impostazione dei breakpoint. Probabilmente non dovrebbe valutare rigorosamente ogni variabile visibile, ma almeno semplificare il processo di osservazione dello stato locale.Qual è un buon modo per eseguire il debug del codice haskell?

Recentemente ho trovato la funzione di traccia che è stata utile consentendo la stampa del debug da punti altrimenti difficili.

+1

Probabilmente lo hai già letto, ma solo per riferimento: http://www.haskell.org/haskellwiki/Debugging – sastanin

risposta

8

Sì, un frontend per il debugger GHCi sarebbe una buona cosa. Forse faremo qualcosa durante il prossimo Hackathon. Tuttavia, nel frattempo:

In alternativa, Haskell si presta bene a test bottom-up utilizzando QuickCheck. Ad esempio, prova i tuoi componenti individualmente, quindi mettili insieme. Se il tuo codice è puro, spesso funziona semplicemente.

+5

Ma spesso, "metterli insieme" è dove si trova il problema. – RnMss

12

Un buon modo per eseguire il debug di codice Haskell consiste nel scrivere e testare le leggi algebriche utilizzando QuickCheck e SmallCheck. Ci sono stati diversi debugger di Haskell tra cui Hat, Hood e Freya, ma nessuno di loro è stato percepito come sufficientemente prezioso da meritare di essere mantenuto per lungo tempo.

Quando è Haskell, devi pensare in modo diverso a come fare le cose. Il documento ICFP sulla pagina QuickCheck ha alcuni buoni esempi per iniziare. Se si desidera un esempio del mondo reale xmonad viene eseguito il debugging completo tramite QuickCheck.

+1

Il link di controllo rapido sta dando un errore 403. (05 ottobre, 03:38:04 UTC) Se questo non è un errore transitorio, qualcuno può postare un nuovo collegamento –

+0

Ecco un link quickcheck aggiornato; (www.cs -> www.cse): http://www.cse.chalmers.se/~rjmh/QuickCheck/ – SuperElectric

+26

Posso osservare rispettosamente che c'è una differenza tra il debug e il test?Il debug sta trovando la causa di un bug, mentre il testing sta cercando l'esistenza di bug. – kristianp

5

Come nota a margine, tenere presente che Debug.trace NON sarà tuo amico durante il debug di programmi multithread.

Il test è la strada da percorrere a lungo termine.

3

Per i miei scopi, trovo che sia una combinazione di fattori.

  1. Scrivere codice di facile funzionamento per il debug, questo significa assicurarsi che le funzioni siano relativamente piccole (5-20 righe) e che facciano ciascuna una cosa definita chiaramente ciascuna.
  2. Utilizzare HUnit per definire i casi di test che faranno emergere i vostri problemi.

Come visto in altre risposte, molte persone amano QuickCheck. Ho trovato difficile definire casi di test QuickCheck significativi per almeno alcuni dei miei codici, quindi in genere fare un uso maggiore dei test unitari standard. Detto questo, c'è un'eccellente introduzione all'uso di QuickCheck in Chapter 11 di Real World Haskell.

Nel caso in cui ci si trovi utilizzando sia QuickCheck che HUnit, è possibile esaminare test-framework.