OTP:20.1.1
Eunitを使ってテストすることが多いです
python2みたいに手軽にprint "Debug Info"
を出したい時Eunitの便利なマクロ群を使うと便利です
erlangでも似たようなことができます
前提
テスト対象モジュールに
-include_lib("eunit/include/eunit.hrl").
eunitのヘッダーを追加します
使用
あとはドキュメント通り使えばいいと思います
自分のよく使うマクロは
debugMsg(Message).
?debugMsg("Enter RoutineA").
/path/to/test.erl:line:PID:Enter RoutineA
debugVal(Expr)
?debugVal(Body).
/path/to/test.erl:line:PID: Body = <<"Request Body">>
debugVal(Expr, Depth)
debugValを使う時Exprが長すぎると、表示が...
により省略されることがあります。
/path/to/test.erl:line:PID: Body = <<"Request Has Lonnnnnng Bo...">>
肝心のデバッグ情報が省略されてこれじゃデバッグできないじゃと悩む時、eunitのソースを読んでみると
-define(debugVal(E, D),
begin
((fun (__V) ->
?debugFmt(<<"~ts = ~tP">>,
[(??E), __V, D]),
__V
end)(E))
end).
-ifndef(EUNIT_DEBUG_VAL_DEPTH).
-define(EUNIT_DEBUG_VAL_DEPTH, 15).
-endif.
-define(debugVal(E), ?debugVal(E, ?EUNIT_DEBUG_VAL_DEPTH)).
つまり?debugVal(Expr)
実は?debugVal(Expr, 15)
を呼び出しています。そしてドキュメントによると
debugVal(Expr, Depth)
Like debugVal(Expr), but prints terms truncated to the given depth.
デフォルトは一つのtermを深さ15まで出力してくれます
したがって?debugVal(Expr, 100000)
にすれば多めに出力してくれます。ただし本番環境だとメモリが食うすぎて気をつけること。OTP21だと?debugVal(Expr, 0)
で全部出力してくれそう(未検証)
しかし?debugVal
マクロが使用するformatは<<"~ts = ~tP">>
なので、charが全部255以下の場合<<50,48,53,53,51,52,51,56,34,44,10,32,34,110,97,109>>
のような意味不明なバイナリーが出力されます
この時は
io:fwrite("show data: ~ts", [Data]).
で~ts
フォーマットを使って出力すれば元の文字列が見れます。
debugFmt(FmtString, Args)
久しぶりにerlangをかくとよくinterpolationのフォーマットが忘れてしまうのでできるだけ避けてきたが、親切なよりexpressive(表現力の高い)デバッグメッセージを出力したい時はやっぱりdubugFmtを使います(@shino さんのサンブルコードを拝借いたします、thx)
?debugFmt("show data: ~ts", [Data])