【发布时间】: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 代码?
【问题讨论】:
-
我猜你必须使用相当于 erl_syntax 的 Elixir 来做到这一点,但我怀疑它是否存在。正如您可能已经完成的那样,您可以print any beam file as erlang code(Elixir 光束文件也是如此),但这不是一个漂亮的景象,也不是您想要的。
-
这里有一个来自 elixir 论坛的帖子,可能有用。好像是在说elixir→beam是一个有损的过程,所以不可能取回原来的代码。 elixirforum.com/t/decompile-beam-files-to-elixir-source-code/…
标签: elixir