【问题标题】:Debugging and debugging tools in Elixir?Elixir 中的调试和调试工具?
【发布时间】:2015-02-25 16:30:34
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 看看这个很棒的列表,其中提到了一些调试工具:github.com/h4cc/awesome-elixir#debugging
  • 不管怎样,我听说这本书:erlang-in-anger.com 对调试 Erlang 有一些很棒的建议。大多数与 Erlang 一起使用的工具同样适用于 Elixir。
  • 不是 100% 相关,但也值得一提 :observer.start(在 IEx 上运行)。它是调试和探索正在运行的应用程序的绝佳工具。
  • 关于调试 Phoenix/cowboy 应用程序的任何想法,例如,如果您想在请求传入时调试控制器的行为。
  • 旧线程,但如果你还没有,你应该检查一下youtube.com/watch?v=pj6zAgvVt5w

标签: elixir


【解决方案1】:

你可以使用IEx

require IEx

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

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

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

【讨论】:

  • 值得一提的是 IO.inspect 返回给定的参数。所以如果你有foo(bar, baz)这样的代码,你可以直接添加foo(IO.inspect(bar), baz),一切都会一样。
  • 这在凤凰城有效吗?我在尝试时遇到服务器崩溃。
  • 对于你要使用的窗口iex.bat --werl -S mix phoenix.server
  • 我希望IEx.pry/1 文档的链接会有用
  • 进一步阅读,官网也有一些详细信息:itelixir-lang.org/getting-started/debugging.html
【解决方案2】:

调试 Cowboy 应用和 Phoenix 应用。

我在 Elixir rader 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]

【讨论】:

  • 我认为混合任务phoenix.start 已被替换为phoenix.server
  • 我是 Elixir 和 Phoenix 的新手,所以这可能是一个转储问题。了解使用 pry 我可以检查变量并且(进入 iex)我可以进行函数调用。但这只是调试器功能的一半:如何跟踪程序的执行流程?是否有其他工具可以让我进入下一行并进入功能? Ruby 的 byebug 具有这两种功能。
  • 如果您使用 Docker 来运行您的 Phoenix 应用程序,这将不起作用。
【解决方案3】:

您可以使用来自https://github.com/qhool/quaffQuaff.Debug 模块

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

我今天用 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 调试器中:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2023-03-04
          • 1970-01-01
          • 2020-08-09
          • 2017-11-13
          • 1970-01-01
          • 1970-01-01
          • 2017-10-20
          • 2017-09-04
          • 1970-01-01
          相关资源
          最近更新 更多