LoginSignup
5
1

More than 1 year has passed since last update.

Elixir dbgをIExで使うときにpryを無効化する方法

Last updated at Posted at 2023-01-21

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セッションが起動します。

落ち着いてnextcontinueを打てば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"
5
1
1

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
5
1