我刚开始使用Elixir,并开始了一个Phoenix项目,非常喜欢它。 由于我有Rails背景,习惯于像"debugger"、"byebug"等调试工具的便利;我想知道是否有类似的Elixir工具?你们是如何调试Elixir应用程序的呢?
哪怕有一个与Ruby中raise my_object.inspect
相当的等效工具,也会大有裨益!
谢谢
我刚开始使用Elixir,并开始了一个Phoenix项目,非常喜欢它。 由于我有Rails背景,习惯于像"debugger"、"byebug"等调试工具的便利;我想知道是否有类似的Elixir工具?你们是如何调试Elixir应用程序的呢?
哪怕有一个与Ruby中raise my_object.inspect
相当的等效工具,也会大有裨益!
谢谢
你可以使用IEx
require IEx
value = {:some, :erlang, :value}
IEx.pry
如果你使用例如 iex -s program.exs
(或者对于一个项目,iex -S mix
)来启动这个程序,当代码到达某一点时,系统会询问你是否允许查看这段代码,并且变量value
可供检查。
你也可以使用IO.inspect
进行打印调试,从而输出基本上任何erlang数据结构。
foo(bar, baz)
,你可以直接将其修改为foo(IO.inspect(bar), baz)
,程序的行为不会发生任何改变。 - José Valimiex.bat --werl -S mix phoenix.server
。意思是要在 Windows 上使用该命令来启动 Phoenix 服务器。 - Sergey调试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]
phoenix.start
混合任务已被替换为 phoenix.server
。 - davoclavoQuaff.Debug
模块。
我今天测试了它与Elixir 1.0.4一起使用,它能正常工作。Debug模块提供了一个简单的辅助接口,可在erlang图形调试器中运行Elixir代码。
使用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}
Exception.blame/3
,可以向某些异常添加调试信息。目前它仅支持FunctionClauseErrors
,应该只在开发过程中使用,因为这是一个昂贵的任务:该函数将从字节码中检索可用条款,并根据给定的参数评估它们。查看发行说明
有一种类似于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
中。
:observer.start
(在 IEx 中运行)。它是一个用于调试和探索应用程序运行的绝佳工具。 - José Valim