Elixirチートシートを作ろう、番外編その４　デバッガを使おう！…いや、VSCodeじゃなくてな。

Elixirチートシートを作ろう、番外編その４　デバッガを使おう！…いや、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の編集

1. プロジェクトを作成し、サンプルファイルを置きます。
サンプルは、上記のDebugging techniques in Elixirから、以下のソースを持ってきました。

https://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/
```
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に書き込みます
```


2. プロジェクトを作る際に、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
```

3. プロジェクトをコンパイルします。
```
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
```

4. 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>}
```

5. デバッグ対象のモジュールを読み込みます。
```
iex(4)> :int.ni(Example)
{:module, Example}
```

6. ブレークポイントを設定して、モジュールを実行します。
```
iex(5)> :int.break(Example, 3)
:ok
iex(6)> Example.double_sum(1,2)
```

さて、デバッガが起動しました。
![デバッガメイン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322473/8d0d3e1a-de0e-0a98-13b9-9ccd8371e2a1.png)

ゴウランガ！メイン画面のpidをクリックすると、下記の画面でデバッグできますね。

![デバッガサブ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322473/1c7aaf08-3313-a6e9-acf6-60129681cca6.png)



本日はここらへんで…デバッガの解説、いるのかなぁ。今の若い人、VS Codeで書きながらやる方が喜びそうな気がする。
年寄りは…ハートで感じろ！感じるんだ！（スパルタ