在 Elixir 中,有多种调试代码的方法。在本章中,我们将介绍一些较常见的方法。
IO.inspect/2
O.inspect(item, opts \\ []) 在调试中真正有用的原因是它返回传递给它的 item 参数而不影响原始代码的行为。让我们看一个例子。
打印:
如您所见,IO.inspect/2 几乎可以“监视”代码中任何地方的值而不改变结果,这使得它在管道内部非常有用,就像上面的情况一样。
IO.inspect/2 还提供了使用标签选项修饰输出的功能。标签将在检查的项目之前打印:
打印:
将 IO.inspect/2 与 binding/0 一起使用也很常见,它会返回所有变量名称及其值:
当使用 :foo, "bar", :baz 调用 some_fun/3 时,它会打印:
分别查看 IO.inspect/2 和 Inspect.Opts 以了解有关该函数的更多信息并阅读有关所有支持的选项的信息。
dbg/2
Elixir v1.14 引入了 dbg/2。dbg 与 IO.inspect/2 类似,但专门针对调试而定制。它打印传递给它的值并返回它(就像 IO.inspect/2 一样),但它还会打印代码和位置。
上面的代码打印以下内容:
在讨论 IO.inspect/2 时,我们提到了将其放置在 |> 管道步骤之间时很有用。dbg 做得更好:它理解 Elixir 代码,因此它会在管道的每个步骤打印值。
此代码打印以下内容:
虽然 dbg 为 Elixir 构造提供了便利,但如果您想在调试时执行代码并设置断点,则需要 IEx。
Pry
使用 IEx 时,您可以传递 --dbg pry 作为选项,以“停止”dbg 调用所在的代码执行:
或者在项目内部进行调试:
现在,对 dbg 的任何调用都会询问您是否要窥探现有代码。如果您接受,您将能够直接从 IEx 访问所有变量以及代码中的导入和别名。这称为“窥探”。在 pry 会话运行时,代码执行将停止,直到调用 continue(或 c)或 next(或 n)。请记住,您始终可以使用 iex -S mix TASK 在项目上下文中运行 iex。
断点
dbg 调用要求我们更改要调试的代码,并且步进功能有限。幸运的是,IEx 还提供了一个 IEx.break!/2 函数,它允许您在任何 Elixir 代码上设置和管理断点,而无需修改其源代码。
与 dbg 类似,一旦到达断点,代码执行就会停止,直到调用 continue(或 c)或 next(或 n)。默认情况下,断点可以逐行导航,但是,当在编译模块上设置断点时,它们无法访问别名和导入。
混合测试任务通过 -b/--breakpoints 标志直接与断点集成。使用该标志时,将在每个将要运行的测试开始时设置一个断点。
以下是一些您可以在实践中使用的命令:
Observer
对于调试复杂系统,直接跳到代码是不够的。必须了解整个虚拟机、进程、应用程序,以及设置跟踪机制。幸运的是,这可以在 Erlang 中使用 :observer 实现。在您的应用程序中:
缺少依赖项
当使用 iex -S mix 在项目内运行 iex 时,observer 将无法作为依赖项使用。为此,您需要先调用以下函数:
如果上述任何调用失败,则可能发生以下情况:某些包管理器默认安装最小化的 Erlang,不带 WX 绑定以提供 GUI 支持。在某些包管理器中,您可能能够用更完整的包替换无头 Erlang(在 Debian/Ubuntu/Arch 上查找名为 erlang vs erlang-nox 的包)。在其他管理器中,您可能需要安装单独的 erlang-wx(或类似名称)包。
以上将打开另一个图形用户界面,该界面提供许多窗格,以全面了解和导航运行时和您的项目。
我们在 Mix & OTP 指南的动态监控器章节中,结合实际项目对 Observer 进行了探讨。这是 Phoenix 框架用于在单台机器上实现 200 万个连接的调试技术之一。
如果您使用的是 Phoenix Web 框架,它附带了 Phoenix LiveDashboard,这是一个用于生产节点的 Web 仪表板,可提供与 Observer 类似的功能。
最后,请记住,您还可以通过在 IEx 中直接调用 Runtime_info/0 来获取运行时信息的简要概述。
其他工具和社区
我们只是触及了 Erlang VM 所提供的功能的皮毛,例如:
1.除了观察者应用程序之外,Erlang 还包括一个 :crashdump_viewer 来查看崩溃转储
2.与操作系统级跟踪器集成,例如 Linux Trace Toolkit、DTRACE 和 SystemTap
3.微状态会计衡量运行时在短时间间隔内花在几个低级任务上的时间
4.Mix 在配置文件命名空间下附带了许多任务,例如 mix profile.cprof 和 mix profile.fprof
5.对于更高级的用例,我们推荐优秀的 Erlang in Anger,它可作为免费电子书使用
祝您调试愉快!