当我们学习一门新的语言时, 要查看一个变量的值, 一般是通过该语言提供的标准输出函数把变量的值打印在终端上查看. Elixir 和其他语言相比有不同的地方, 除了提供了 IO.puts/2 , 以及 IO.inspect/2 标准的控制台输出函数输出变量的值. 还提供了其他调试方法.
本文介绍了Elixir调试的三种工具, 分别为 IEx.pry/0 , :debugger 和 Erlyberly 客户端图形工具
IEx.pry pry 英文解释为: 刺探;侦察;窥探 , 不言而喻, 其作用是查看程序运行的内部状态, 在 Elixir 中它的基本作用是: 查看 IEx.pry 插入点位置所在的作用域的内部状态.
要使用 IEx.pry , 需要在全局作用域或模块中 require
defmodule Example def double_sum(x, y) do hard_work(x, y) end def hard_work(x, y) do x = 2 * x y = 2 * y x + y end end 输入 respawn 可退出 pry , 另外, 如果调试代码有多个 IEx.pry 插入点 respawn 后会自动进入下一个.
:debugger 如果你需要断点功能, 我们可以使用Erlang提供的 :debugger 模块, 现在来演示一下:
defmodule Example def double_sum(x, y) do hard_work(x, y) end def hard_work(x, y) do x = 2 * x y = 2 * y x + y end end 现在我们启动 :debugger
$ iex -S mix Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Compiled lib/example.ex Interactive Elixir (1.2.4) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> :debugger.start() {:ok, #PID<0.87.0>} iex(2)> :int.ni(Example) {:module, Example} iex(3)> :int.break(Example, 3) :ok iex(4)> Example.double_sum(1,2) 当你启动了 :debugger , 一个图形界面同时会打开.
:int.break(Example, 3) 在第三行添加了一个断点, 在打开的图形界面中可以向其他断点调试工具类似的方法使用
详细的说明参考 Erlang文档 Debugger
Erlyberly Erlyberly 的好处在于不会中断进程的执行, 在产品和开发环境中都可以使用, 在启动的时候要求你指定目标节点的名称和Cookie.
要让能够工作, 需要指定 --name 或 --sname 参数. Cookie 用于验证和连接节点. Cookie 的值可以通过 Node.get_cookie/0 , 或 ~/.erlang.cookie
使用 ~/.erlang.cookie 文件中的 Cookie 值
iex --name "foo@127.0.0.1" -S mix 命令行指定 Cookie
iex --name "foo@127.0.0.1" --cookie "my_cookie" -S mix
内存图基于 :erlang.memory() 提供的信息, 表示在Erlang VM中内存使用情况. 并非操作系统相关的内存.
关于 Erlyberly 的详细资料, 参考 Erlyberly 项目主页
每种工具提供不同的调试场景, 请按自己的需要选择. 本文旨在抛砖引玉, 细节如何操作, 请自己探索, 在这里就不多说了.
Debugging techniques in Elixir
How to trace Elixir nodes with Erlyberly