Elixir中的调试和调试工具?


68

我刚刚开始使用Elixir,并且已经启动了Phoenix项目,我对此非常满意。现在,有了Rails背景知识,我就习惯了调试工具,例如“ debugger”,“ byebug”等;我想知道是否有用于Elixir的类似工具?你们如何调试Elixir应用程序?

甚至与Rubys一样raise my_object.inspect,也会产生奇迹!

谢谢


1
看一下这个很棒的列表,提到一些调试工具:github.com/h4cc/awesome-elixir#debugging
h4cc 2015年

1
对于它的价值,我听说过这本书:erlang-in-anger.com在调试Erlang方面有一些很棒的建议。一个将与Erlang一起使用的大多数工具同样适用于Elixir。
Onorio Catenacci 2015年

3
不是100%相关,但也值得一提:observer.start(在IEx上运行)。它是调试和探索正在运行的应用程序的好工具。
何塞·Valim

有关调试凤凰/牛仔的应用程序,有什么想法说,如果你要调试控制器的行为时,在请求卷。
MartinElvar

Answers:


75

您可以使用 IEx

require IEx

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

例如,如果您以iex -s program.exs(或iex -S mix针对某个项目)启动该程序,系统将询问您是否要允许在到达该代码时撬入该代码,并value可供您检查。

您还可以使用IO.inspect基本上允许您输出任何erlang数据结构的方式来进行打印调试。


40
值得一提的是IO.inspect返回给定的参数。因此,如果您有类似的代码foo(bar, baz),则可以直接添加,foo(IO.inspect(bar), baz)并且所有内容的行为都相同。
何塞·Valim

这在凤凰城工作吗?尝试时出现服务器崩溃。
Chase

4
用于您要使用的Windowsiex.bat --werl -S mix phoenix.server
Sergey

1
我希望指向IEx.pry / 1文档的链接会有用
rchavarria

为了进一步阅读,官方网站上还提供了一些有关以下信息的详细信息:elixir-lang.org/getting-started/debugging.html
MiguelPéres

32

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

我在Elixir Rader中看到了这个帖子 网站http://www.jessetrimble.net/iex-pry-elixir中,并认为我会在这里进行总结,因为它非常方便:-)。

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

在Phoenix中使用撬动时,以上结果将导致

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

6
我是Elixir和Phoenix的新手,所以这可能是一个转储问题。在理解使用pry的过程中,我可以检查变量,并且(进入iex)可以进行函数调用。但这只是调试器功能的一半:如何跟踪程序的执行流程?还有其他工具可以让我进入下一行并进入功能吗?Ruby的byebug具有两种功能。
pmontrasio 2015年

如果您使用Docker运行Phoenix应用程序,则将无法使用。
Sebastialonso


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调试器中:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.