dbgとは
Elixir言語でデバッグするときに使用される関数です。
まだdbgを使ったことがない方はQiitaにいくつか日本語で説明された記事がありますのでそちらをご覧ください。
もちろんElixir言語の公式ドキュメントにも載ってます。
dbgをIExで使うときの問題点
こういったコメントをElixirコミュニティで見かけます。
実際にIExを開きdbg挙動を確認してみます。
$ iex
Erlang/OTP 25 [erts-13.1.3] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit] [dtrace]
Interactive Elixir (1.14.3) - press Ctrl+C to exit (type h() ENTER for help)
iex>
iex> "hello" |> String.upcase |> dbg()
Break reached: iex:3
pry>
初期設定の状態では、IEx起動中にdbgを使用するとdbgの呼び出しがある場所でコード実行が停止し、pryセッションが起動します。
落ち着いてnextかcontinueを打てばpryセッションを終了させることができます。
pry> next
"hello" |> String.upcase() #=> "HELLO"
[:ok]
Interactive Elixir (1.14.3) - press Ctrl+C to exit (type h() ENTER for help)
iex>
pryはデバックをする際に便利な機能ではあるのですが、ただ単に値を確認したいだけの場合には余計な機能でもあります。
dbgをIExで使うときにpryを無効化する方法
一言で言うとこうなります。
-
:elixirアプリケーションの設定の:dbg_callbackキーの値を{Macro, :dbg, []}にする
IEx起動後に設定変更
必要に応じてIExから設定変更します。
iex> Application.put_env(:elixir, :dbg_callback, {Macro, :dbg, []})
:ok
iex> "hello" |> String.upcase |> dbg() [iex:2: (file)]
"hello" #=> "hello"
|> String.upcase() #=> "HELLO"
"HELLO"
~/.iex.exsファイルから設定変更
IExで使うときにいつもpryを無効化したい場合は、ご自身の~/.iex.exsファイルでpryの設定変更ができます。
Application.put_env(:elixir, :dbg_callback, {Macro, :dbg, []})
~/.iex.exsファイルを使ってことがない方はQiitaにいくつか日本語で説明された記事がありますのでそちらをご覧ください。
もちろんElixir言語の公式ドキュメントにも載ってます。
IEx起動時に--no-pryオプションを渡す技
IExを起動するときに、--no-pryオプションを渡す技もあります。この手法が一番シンプルと言えるかもしれません。
@zacky1972 さんからお便りをいただき知りました。ありがとうございます。
$ iex --no-pry
Erlang/OTP 25 [erts-13.1.3] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit] [dtrace]
Interactive Elixir (1.14.3) - press Ctrl+C to exit (type h() ENTER for help)
iex>
iex> "hello" |> String.upcase |> dbg()
[iex:1: (file)]
"hello" #=> "hello"
|> String.upcase() #=> "HELLO"
"HELLO"