Dbgi块中漂亮的Elixir源代码

leg*_*cia 7 elixir

如果我有从Erlang代码使用编译的光束文件debug_info,则打印相应的源代码相当容易:

{ok, {_, [{debug_info, {debug_info_v1, erl_abstract_code, AbstractCode}}]}} =
    beam_lib:chunks("my_module.beam", [debug_info]).
{ok, Forms} = erl_abstract_code:debug_info(erlang_v1, module_name, AbstractCode, []).
io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(Forms))]).
Run Code Online (Sandbox Code Playgroud)

但是Elixir呢?我可以这样做的前两个步骤:

{ok, {_, [{debug_info, {debug_info_v1, elixir_erl, AbstractCode}}]}} = 
    beam_lib:chunks("Elixir.MyModule.beam", [debug_info]).
{ok, Forms} = elixir_erl:debug_info(elixir_v1, module_name, AbstractCode).
Run Code Online (Sandbox Code Playgroud)

这给出了这种形式的地图:

#{attributes => ...,
  compile_opts => [],
  definitions => ...,
  deprecated => [],
  file => <<"my_module.ex">>,
  line => 95,
  module => 'Elixir.MyModule',
  unreachable => []}
Run Code Online (Sandbox Code Playgroud)

如何将其打印为人类可读的Elixir代码?

小智 3

有一个 Visual Studio扩展可以将 BEAM 文件解码为 Elixir 源代码:

\n\n
\n

要激活扩展,请从资源管理器视图中 .beam 文件的上下文菜单中选择“反汇编 BEAM”:

\n
\n\n

在此输入图像描述

\n\n

以下参考文献:

\n\n

1)https://elixirforum.com/t/visual-studio-code-extension-to-view-beam-files/13373/4

\n\n

2)http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html

\n\n

编辑1:---

\n\n

ElixirLS是另一个用于调试 Elixir 或 Erlang 代码的工具。

\n\n
\n

您编译的 .beam 模块不具有发送这些消息所需的函数调用。在其他语言中,您可能会编译两个版本的二进制文件,一种带有调试调用,另一种不带有调试调用,但在 Elixir 中,它的工作方式有点不同。

\n\n

当您使用选项集编译 Erlang 或 Elixir 模块时:debug_info,生成的 .beam 文件包含带有代码的 Erlang 抽象格式表示的块。在调试模块之前,您必须通过调用 \xe2\x80\x9cinterpret\xe2\x80\x9d 来:int.ni/1读取该块,然后清除该模块。之后,未来对该模块的任何调用都将通过评估 Erlang 抽象形式并在每次评估后对元流程进行必要的调用来处理。

\n\n

手动调用:int.ni/1项目中的每个模块是一件痛苦的事情,因此当您在 ElixirLS 调试器中运行 Mix 任务时,它会自动解释项目中的所有模块及其依赖项。对于大多数项目来说,这是一个很好的默认值,尽管它可能会导致启动任务时出现明显的延迟。ElixirLS 的未来版本可能会包含更多配置选项来指定要解释的模块。

\n\n

注意:由于必须在调试之前解释模块,因此您无法调试模块定义之外的任何代码。

\n
\n\n

重要链接:

\n\n

1)https://medium.com/@JakeBeckerCode/debugging-elixir-in-vs-code-400e21814614

\n\n

2)http://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/

\n\n

3)https://zorbash.com/post/debugging-elixir-applications/#otp-behaviour-tracing

\n