6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 4

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

Posted at

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の編集

  1. プロジェクトを作成し、サンプルファイルを置きます。
    サンプルは、上記の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に書き込みます
  1. プロジェクトを作る際に、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
  1. プロジェクトをコンパイルします。
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
  1. 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>}
  1. デバッグ対象のモジュールを読み込みます。
iex(4)> :int.ni(Example)
{:module, Example}
  1. ブレークポイントを設定して、モジュールを実行します。
iex(5)> :int.break(Example, 3)
:ok
iex(6)> Example.double_sum(1,2)

さて、デバッガが起動しました。
デバッガメイン画面.png

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

デバッガサブ画面.png

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

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?