Elixir 中的调试调试工具?

Debugging and debugging tools in Elixir?

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

即使相当于 Rubys raise my_object.inspect,也会创造奇迹!

谢谢

您可以使用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 模块

The Debug module provides a simple helper interface for running Elixir code in the erlang graphical debugger

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

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

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

在 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]

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

  • 监视器中的左侧面板 window 显示加载的模块。
  • 模块菜单,底部项目显示加载的模块,带有 'View' 和 'Delete' 子菜单。使用“查看”菜单查看带有行号的源代码。
  • 要放置断点,请使用 Break 菜单,Line breaks...
  • 运行 你的程序,直到它停在指定的行。监视器 windows 显示状态为 'break' 的进程。双击此行以在调试器中打开附加进程。在这里你可以步进,步过(下一步),继续,上升,检查值等。要步进另一个模块,它也必须像上面一样加载。
  • 如果放置不正确,断点将被忽略。如果您有多行管道,请将断点放在最后一行。

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

有一种类似于 byebug 的调试测试的方法:使用命令 iex -S mix test,这将 运行 你的测试,如果遇到 IEx.pry,它会询问你是否想 "stop" 那里并分析其上下文。

代码示例:

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