在 Elixir 中调试和调试工具?

我刚刚开始使用长生不老药,并已经开始了一个凤凰项目,我很喜欢。 现在有了 Rails 背景,我已经习惯了调试工具,比如“ debug”、“ byebug”等等,我想知道是否有类似的 Elixir 工具?你们是怎么调试长生不老药应用程序的?

即使是一个相当于鲁比 raise my_object.inspect,将做奇迹!

谢谢你

15738 次浏览

你可以使用 IEx

require IEx


value = {:some, :erlang, :value}
IEx.pry

如果你开始这个程序,例如 iex -s program.exs(或 iex -S mix为一个项目) ,你会被问到,如果你想允许窥探这个代码时,它达到了,value将可供你检查。

您还可以使用 IO.inspect进行打印调试,从而基本上可以输出任何 erlang 数据结构。

您可以使用 https://github.com/qhool/quaff中的 Quaff.Debug模块

Debug 模块为运行 Elixir 提供了一个简单的助手界面 Erlang 图形调试器中的代码

我今天用长生不老药1.0.4测试了一下,很管用。

调试牛仔应用程序和凤凰应用程序。

我在 Elixir Rader http://www.jessetrimble.net/iex-pry-elixir上看到了这篇文章,我想我可以在这里总结一下,因为它非常方便: ——)。

在 Rails 应用程序(和其他应用程序)中,您可以简单地将调试器标记放在控制器中,当路径被触发时,它将在调试器标记处中断。

在凤凰城使用 pry 时,以上结果将导致

Cannot pry #PID<0.259.0> at web/controllers/posts_controller.ex:8. Is an IEx shell running?

原来 Phoenix 进程必须在一个 IEx 会话中运行,就是这样做的

iex -S mix phoenix.server

现在你会看到

Request to pry #PID<0.266.0> at web/controllers/posts_controller.ex:9. Allow? [Yn]

使用 Erlang 调试器。 例如 Phoenix 1.3和 Elixir 1.5.1,源文件: ./lib/todo/api/api.ex,模块名为: Todo.API

~/elixir/todo_app/ iex -S mix phx.server
Erlang/OTP 20 [erts-9.0] [source] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]


[info] Running TodoWeb.Endpoint with Cowboy using http://0.0.0.0:4000
Interactive Elixir (1.5.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> :debugger.start()
{:ok, #PID<0.373.0>}
iex(2)> :int.ni(Todo.API)
{:module, Todo.API}

在 Erlang 调试器中:

  • Monitor 窗口中的左面板显示加载的模块。
  • “模块”菜单,下面的项目显示加载的模块,带有“查看”和“删除”子菜单。使用“视图”菜单查看具有行号的源。
  • 若要放置断点,请使用“中断”菜单、“换行”..。
  • 运行程序,直到它停在指定的行。Monitor 窗口显示一个状态为“ break”的进程。双击此行可在调试器中打开附加进程。在这里,您可以单步执行、单步执行(下一步)、继续、上升、检查值等。要进入另一个模块,也必须像上面那样加载它。
  • 如果放置不正确,将忽略断点。如果有多行管道,请将断点放在最后一行。

在 Elixir 1.5和 OTP 20中,有一个新的函数 Exception.blame/3,它可以向某些异常添加调试信息。它现在只支持 FunctionClauseErrors,您应该只在开发中使用它,因为它是一项昂贵的任务: 该函数将从字节码中检索可用的子句,并根据给定的参数对它们进行计算。见释放

有一种与 byebug 类似的调试测试的方法: 使用命令 iex -S mix test,它将运行您的测试,如果遇到 IEx.pry,它将询问您是否要“停止”并分析其上下文。

代码示例:

defmodule AppTest do
def hello do
test_variable = "john doe"
require IEx; IEx.pry
:world
end
end
defmodule AppTestTest do
use ExUnit.Case
doctest AppTest


test "greets the world" do
assert AppTest.hello() == :world
end
end

运行 iex -S mix test将在 require IEx; IEx.pry中停止。

资料来源: https://elixirforum.com/t/how-to-debug-exunit-tests-with-debugger/14170/4