Elixirチートシートを作ろう、番外編その4 デバッガを使おう!…いや、VSCodeじゃなくてな。
1. OverView
どもども、うん、アドベントカレンダーの完走賞狙いなんだ、すまない。
VSCodeがあるじゃん、解散!と言われそうですが、Build-Inのデバッガも面白いので、記事にしとこうかと。
2. 解説
2.1 まずはデバッグに使える関数のお話から
さて、まずは元ネタから
https://qiita.com/MzRyuKa/items/74f4bc8ea5f3f8cc3d5a
Elixir 1.14.0-rc.0から追加されたそうで、とっても使いやすいコマンドになってます。
ぶっちゃけ、デバッガ要らなくね?時代変わってね?とか思ったくらい。(個人差がありますよ)
パイプの際に、各段階でどう処理されているか、と言うのがとても簡単に見えます。
以下のサンプル、"Dbg() is great"と言う文字列を、すべて大文字(String.upcase())にし、LIST形式(String.split())に分割しております。
この流れの最後に、 |> dbg()と書いて、dbg関数に渡してやるだけです。
iex(13)> testlist = "Dbg() is great" |> String.upcase() |> String.split() |> dbg()
[iex:13: (file)]
"Dbg() is great" #=> "Dbg() is great"
|> String.upcase() #=> "DBG() IS GREAT"
|> String.split() #=> ["DBG()", "IS", "GREAT"]
["DBG()", "IS", "GREAT"]
iex(14)> testlist
["DBG()", "IS", "GREAT"]
綺麗に、String.upcase(), String.split()がどう言う出力をしているかがわかりますね。
"Dbg() is great" #=> "Dbg() is great"
|> String.upcase() #=> "DBG() IS GREAT"
|> String.split() #=> ["DBG()", "IS", "GREAT"]
処理結果は、testlistと言う変数にbindしているのですが、dbg()は処理結果に何も与えてないのでご安心ください。
2.2 Erlangのデバッガを起動してみよう。
そう、デバッガはGUIが良いですねぇ、そうそう、三十年前くらいになるのかァ。Sun(検閲)
と、言うわけでGUIのデバッガも使ってみましょうか?
まずは、参考文献から
Elixir入門 21: デバッグ
https://dev.to/gumi/elixir-21--21a1
この記事が参考にしている、Debugging techniques in Elixir
https://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/
さらに、Erlangのデバッガが動かなかったので、解決策が書いてあるのがこちら。
https://elixirforum.com/t/debugger-not-found-in-iex-s-mix/60782/1
…先輩方、ありがとうございます。
2.2.1 mix.exsの編集
- プロジェクトを作成し、サンプルファイルを置きます。
サンプルは、上記のDebugging techniques in Elixirから、以下のソースを持ってきました。
defmodule Example do
def double_sum(x, y) do
hard_work(x, y)
end
defp hard_work(x, y) do
x = 2 * x
y = 2 * y
x + y
end
end
C:\Users\nanbu> mix new example
※ここで、上記のソースをlib/example.exに書き込みます
- プロジェクトを作る際に、mix.exsのelixirc_optionsにdebug_info: trueを追加してください。
C:\Users\nanbu\example配下に、mix.exsと言うファイルがありますね?
そいつを。以下のelixirc_options:のところを、書き換えて下さい。
def project do
[
app: :example,
version: "0.1.0",
elixir: "~> 1.15",
start_permanent: Mix.env() == :prod,
elixirc_options: [debug_info: true],
deps: deps()
]
end
- プロジェクトをコンパイルします。
C:\Users\nanbu>cd C:\Users\nanbu\example
C:\Users\nanbu\example>mix deps.get
All dependencies are up to date
C:\Users\nanbu\example>mix compile
Compiling 1 file (.ex)
Generated example app
- iexを起動し、そこで、デバッガを起動します。
C:\Users\nanbu\example>iex.bat -S mix
iex(1)> Mix.ensure_application!(:wx)
:ok
iex(2)> Mix.ensure_application!(:debugger)
:ok
iex(3)> :debugger.start()
{:ok, #PID<0.135.0>}
- デバッグ対象のモジュールを読み込みます。
iex(4)> :int.ni(Example)
{:module, Example}
- ブレークポイントを設定して、モジュールを実行します。
iex(5)> :int.break(Example, 3)
:ok
iex(6)> Example.double_sum(1,2)
ゴウランガ!メイン画面のpidをクリックすると、下記の画面でデバッグできますね。
本日はここらへんで…デバッガの解説、いるのかなぁ。今の若い人、VS Codeで書きながらやる方が喜びそうな気がする。
年寄りは…ハートで感じろ!感じるんだ!(スパルタ