GHCiでHaskellデバッグ チートシート

最近すごいH本でHaskellの勉強を始めたKekehoです。

関数型言語を学ぶのは初めてで、なかなか挙動がスッと理解できないことも多く困っていました。

そんな時、GHCiで簡単にデバッグができてしまうと知ったので記事にしておきます。

まだ勉強中で正しい表現ができているか不安です…おかしいところあればご指摘いただけたら嬉しいです。

もっと詳細に知りたい場合は、以下のリンクがわかりやすかったので読んでみてください。

参考: GHCiデバッガ


:break ブレークポイントの設置

基本的には指定した行の一番左の部分式にブレークポイントが置かれるようです。

モジュール名が省略された場合、直前にロードされたモジュールとなるようです。


ブレークポイントの設置

:break [関数名]  -- 関数を定義した行にブレークポイントを設置

:break [行番号] -- 直前にロードしたモジュールのn行目に設置
:break [行番号] [列番号] -- n行目のm文字目に設置
:break [モジュール名] [行番号] -- モジュール名の指定も可能(上の3つのように指定しないと、直前にロードされたモジュールになる)
:break [モジュール名] [行番号] [列番号]


breaks ブレークポイント一覧

ブレークポイント一覧が表示されます。


ブレークポイント一覧

:show breaks



:step ステップ実行

ブレークポイントで停止した後、ステップ実行することができます。


ステップ実行

:step  -- 普通にプログラム内でステップ実行

:steplocal -- 現在の関数内でステップ実行
:stepmodule -- 現在のモジュール内でステップ実行


:continue ステップ実行を抜けてプログラムを続ける


continue

:continue



ステップ実行中に式を評価する

他の言語で言うところの、変数の中身を見るって感じです。「式を評価する」という表現が適切なのかよくわかりません。指摘お願いします。

ステップ実行中に、普通にその場で式を書けば評価された値が表示されます。


式を評価

[]  -- 評価された値が表示される

:t [] -- 型の情報

他にも代入とかいろいろできます。


:list 現在のブレークポイント周辺のコードを表示


周辺のコードを見る

:list



-fbreak-on-exception 例外が投げられたら止まる

Exceptionが投げられたらそこで評価が止まり、自動的にステップ実行に入ります。

:traceなどと併用すると便利です。


例外で止める

:set -fbreak-on-exception  -- 例外が発生したら止める

:set -fbreak-on-error -- 例外が補足されなかった場合にのみ止める


:trace 追跡実行

式を追跡付きで評価できます。


トレース

:trace []

-- 実行後
:hist -- 履歴一覧
:back -- 履歴を前にさかのぼって調査
:forward -- 履歴をさかのぼっている最中、次に進む