Elixir中的调试和调试工具?

72

我刚开始使用Elixir,并开始了一个Phoenix项目,非常喜欢它。 由于我有Rails背景,习惯于像"debugger"、"byebug"等调试工具的便利;我想知道是否有类似的Elixir工具?你们是如何调试Elixir应用程序的呢?

哪怕有一个与Ruby中raise my_object.inspect相当的等效工具,也会大有裨益!

谢谢


1
请看一下这个令人惊叹的列表,其中提到了一些调试工具:https://github.com/h4cc/awesome-elixir#debugging - h4cc
1
说句实话,我听说这本书:http://www.erlang-in-anger.com/在调试Erlang方面提供了一些绝妙的建议。大多数与Erlang相关的工具同样适用于Elixir。 - Onorio Catenacci
3
虽然不完全相关,但值得一提的是 :observer.start (在 IEx 中运行)。它是一个用于调试和探索应用程序运行的绝佳工具。 - José Valim
如果您想调试Phoenix/cowboy应用程序,比如在请求到达时调试控制器的行为,您有什么想法吗? - MartinElvar
旧帖子,但如果你还没有看过的话,你应该去看一下这个视频 https://www.youtube.com/watch?v=pj6zAgvVt5w - Shashank Kulkarni
6个回答

77

你可以使用IEx

require IEx

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

如果你使用例如 iex -s program.exs(或者对于一个项目,iex -S mix)来启动这个程序,当代码到达某一点时,系统会询问你是否允许查看这段代码,并且变量value可供检查。

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


43
值得一提的是,IO.inspect会返回传入的参数。因此,如果你有这样的一段代码foo(bar, baz),你可以直接将其修改为foo(IO.inspect(bar), baz),程序的行为不会发生任何改变。 - José Valim
这在Phoenix中可行吗?当我尝试时,服务器会崩溃。 - Chase
4
对于 Windows ,您想使用 iex.bat --werl -S mix phoenix.server。意思是要在 Windows 上使用该命令来启动 Phoenix 服务器。 - Sergey
2
希望提供IEx.pry/1文档链接会很有用。 - rchavarria
进一步阅读,官方网站还提供了一些关于此的详细信息:https://elixir-lang.org/getting-started/debugging.html - Miguel Péres

33

调试Cowboy应用程序和Phoenix应用程序。

我在Elixir阅读器中看到了这篇文章http://www.jessetrimble.net/iex-pry-elixir,想在这里简要总结一下,因为它非常方便 :-).

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

在Phoenix中使用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]

1
我认为 phoenix.start 混合任务已被替换为 phoenix.server - davoclavo
7
我对Elixir和Phoenix不太熟悉,所以这可能是个愚蠢的问题。我知道可以使用Pry来检查变量,在iex中可以调用函数。但这只有调试器功能的一半:如何跟踪程序的执行流程?是否有其他工具可以让我按行前进并进入函数?Ruby的byebug具有这两个功能。 - pmontrasio
如果你正在使用Docker来运行你的Phoenix应用程序,这是行不通的。 - Sebastialonso

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

Debug模块提供了一个简单的辅助接口,可在erlang图形调试器中运行Elixir代码。

我今天测试了它与Elixir 1.0.4一起使用,它能正常工作。

4

使用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调试器中:
  • 监视器窗口的左侧面板显示已加载的模块。
  • 模块菜单底部的项目显示已加载的模块,包括“查看”和“删除”子菜单。使用“查看”菜单可以查看带有行号的源代码。
  • 要设置断点,请使用“断点”菜单,选择“行断点…”
  • 运行程序直到它停在指定的行上。监视器窗口会显示一个状态为“中断”的进程。双击该行以在调试器中打开附加的进程。在这里,您可以进行步进、跳过(下一步)、继续、返回、检查值等操作。如果要进入另一个模块,则必须像上述那样加载它。
  • 如果未正确放置断点,则将忽略断点。如果您有多行管道,请将断点放在最后一行。

1
在Elixir 1.5和OTP 20中,有一个新函数Exception.blame/3,可以向某些异常添加调试信息。目前它仅支持FunctionClauseErrors,应该只在开发过程中使用,因为这是一个昂贵的任务:该函数将从字节码中检索可用条款,并根据给定的参数评估它们。查看发行说明

0

有一种类似于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接