Elixir中的调试和调试工具?

时间:2015-02-25 16:30:34

标签: elixir

我刚开始使用Elixir,并开始了凤凰城项目,我非常喜欢。 现在有了rails后台,我习惯于被调试工具所破坏,比如“debugger”,“byebug”等等;我想知道Elixir是否有类似的工具?你们是如何调试Elixir应用程序的?

甚至相当于Rubys raise my_object.inspect,也会有奇迹!

谢谢

6 个答案:

答案 0 :(得分:71)

您可以使用IEx

require IEx

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

如果您使用例如iex -s program.exs(或项目的iex -S mix)启动此程序,系统会询问您是否允许在到达此代码时允许窥探此代码并{{1}将供您检查。

您也可以使用value进行打印调试,以便输出基本上任何erlang数据结构。

答案 1 :(得分:31)

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

我在Elixir rader http://www.jessetrimble.net/iex-pry-elixir中看到了这篇文章,并认为我会在这里总结一下,因为它非常方便: - )。

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

在凤凰城使用撬时,上面会产生

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]

答案 2 :(得分:10)

您可以使用https://github.com/qhool/quaff

中的Quaff.Debug模块
  

Debug模块提供了一个用于运行Elixir的简单帮助程序接口   erlang图形化调试器中的代码

我今天用Elixir 1.0.4进行了测试,它有效。

答案 3 :(得分:1)

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

  • “监视器”窗口中的左侧面板显示已加载的模块。
  • “模块”菜单,底部项目显示已加载的模块,其中包含“查看”功能。并且&#39;删除&#39;子菜单。使用“查看”菜单查看包含行号的来源。
  • 要设置断点,请使用“中断”菜单,换行符...
  • 运行程序,直到它停在指定的行。监控窗口显示状态为“休息”的流程。双击此行以在调试器中打开附加的进程。在这里,您可以步进,跳过(下一步),继续,上升,检查值等。要进入另一个模块,它也必须像上面那样加载。
  • 如果未正确放置断点,将忽略断点。如果您有多行管道,请将断点放在最后一行。

答案 4 :(得分:1)

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

答案 5 :(得分: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