【问题标题】:Pretty-print Elixir source code from Dbgi chunk来自 Dbgi 块的漂亮打印 Elixir 源代码
【发布时间】:2019-04-03 15:01:38
【问题描述】:

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

{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))]).

但是长生不老药呢?我可以像这样执行前两个步骤:

{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).

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

#{attributes => ...,
  compile_opts => [],
  definitions => ...,
  deprecated => [],
  file => <<"my_module.ex">>,
  line => 95,
  module => 'Elixir.MyModule',
  unreachable => []}

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

【问题讨论】:

标签: elixir


【解决方案1】:

有一个Visual Studioextension可以将BEAM文件解码成Elixir源码:

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

以下参考:

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

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

编辑1:---

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

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

当您使用 :debug_info 选项集编译 Erlang 或 Elixir 模块时,生成的 .beam 文件包含一个带有您的代码的 Erlang 抽象格式表示的块。在你可以调试一个模块之前,你必须通过调用:int.ni/1来“解释”它,它会读取这个块然后清除模块。之后,对模块的任何未来调用都会通过评估 Erlang 抽象形式并在每次评估后对元进程进行必要的调用来处理。

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

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

重要链接:

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

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

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

【讨论】:

  • 好像显示的是反汇编的字节码,而不是源代码? Beam 文件中的调试信息部分看起来像是一个带有行号的相当完整的语法树,所以我希望看到更接近原始源代码的东西。
猜你喜欢
  • 2021-03-06
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多