dbgとは
Elixir言語でデバッグするときに使用される関数です。
まだdbg
を使ったことがない方はQiitaにいくつか日本語で説明された記事がありますのでそちらをご覧ください。
もちろんElixir言語の公式ドキュメントにも載ってます。
dbgをIExで使うときの問題点
こういったコメントをElixirコミュニティで見かけます。
実際にIExを開きdbg
挙動を確認してみます。
OSのシェルからIExを起動
$ 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
iex> "hello" |> String.upcase |> dbg()
Break reached: iex:3
pry>
初期設定の状態では、IEx起動中にdbg
を使用するとdbg
の呼び出しがある場所でコード実行が停止し、pryセッションが起動します。
落ち着いてnext
かcontinue
を打てばpryセッションを終了させることができます。
pry起動中のIExで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から設定変更してpryを無効化
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の設定変更ができます。
~/.iex.exs
Application.put_env(:elixir, :dbg_callback, {Macro, :dbg, []})
~/.iex.exs
ファイルを使ってことがない方はQiitaにいくつか日本語で説明された記事がありますのでそちらをご覧ください。
もちろんElixir言語の公式ドキュメントにも載ってます。
IEx起動時に--no-pry
オプションを渡す技
IExを起動するときに、--no-pry
オプションを渡す技もあります。この手法が一番シンプルと言えるかもしれません。
@zacky1972 さんからお便りをいただき知りました。ありがとうございます。
OSのシェルから--no-pryオプションをつけてIExを起動
$ 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>
pryが無効化されたIEx
iex> "hello" |> String.upcase |> dbg()
[iex:1: (file)]
"hello" #=> "hello"
|> String.upcase() #=> "HELLO"
"HELLO"