我有要反编译的Erlang应用程序的梁文件。

应用程序已编译并使用'debug_info'选项进行构建。这是用于构建应用程序的emake文件的片段:

{"apps/my_app/src/*",   [debug_info, nowarn_export_all, {outdir, "apps/my_app/ebin"},{pa, "deps"},{parse_transform, lager_transform}, {parse_transform, events_transform}]}.


我尝试了beam_lib模块的功能,但得到以下错误: >
1>{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(abc,[abstract_code]).
** exception error: no match of right hand side value {error,beam_lib,{not_a_beam_file,'abc.beam'}}


我还尝试了以下帖子中提到的解决方案:在没有debug_info的情况下反编译erlang .beam文件。我收到以下错误消息:

1> file:write_file("/tmp/my_module_disasm", io_lib:fwrite("~p.\n", [beam_disasm:file(abc)])).
ok


/ tmp / my_module_disasm文件包含:想法?

#1 楼

您是否尝试过使用recon:source / 1?
我认为它完全可以满足您的需求。
如果您不想使用它,至少可以从其源代码中得到启发:

-spec source(module()) -> iolist().
source(Module) ->
    Path = code:which(Module),
    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Path, [abstract_code]),
    erl_prettypr:format(erl_syntax:form_list(AC)).


评论


我已经尝试过了,可以在帖子的代码片段中看到它。

–parmar7725274
17-10-31在3:11

看起来您的模块(abc)尚未编译。代码是什么:which(abc)。返回?

–布鲁乔·贝纳维德斯(Brujo Benavides)
17年11月1日在21:10



我已经从活动节点上进行了备份。所以我不认为它没有被编译。而代码:which(abc)返回梁文件的绝对路径。

–parmar7725274
17年11月2日在6:02



实际上,仔细观察,您所看到的错误来自此处,这意味着您的文件不是以FOR1____BEAM之类的开头(即与<<“ FOR1”,_ Size:32,“ BEAM” >>匹配的某种东西)。出于好奇,您能告诉我abc.beam文件的前12个字节吗?

–布鲁乔·贝纳维德斯(Brujo Benavides)
17年11月2日,12:48



在这里是:<< 69,82,76,50,62,12,178,214,62,207,41,11 >>或可打印格式<<《 ERL2> \ f \ 262 \ 326> \ 317)\ v“ >>。

–parmar7725274
17年11月2日在15:13