我发现需要使用.erl
参数编译debug_info
文件,以便在调试器中对其进行调试。
当我尝试在调试器中调试.beam
文件时,我总是看到该文件没有调试信息且无法打开。
**无效的光束文件或无抽象代码:" /erlang-debug/myapp.beam"
我怀疑可能是我以错误的方式编译文件。 我尝试了所有可能的方式,但仍然没有运气,我觉得文件是在没有debug_info的情况下编译的。
Erlang documentation page上提到了我使用过的最简单的一个例子:
% erlc +debug_info module.erl
有没有办法知道某个特定的.beam
文件是否使用debug_info编译?
答案 0 :(得分:6)
您可以使用module_info函数访问所有编译选项。要对调试信息标志进行测试,可以使用proplists函数来提取信息:
1> O = fun(M) ->
1> Comp = M:module_info(compile),
1> Options = proplists:get_value(options,Comp),
1> proplists:get_value(debug_info,Options)
1> end.
#Fun<erl_eval.6.50752066>
2> c(p564).
{ok,p564}
3> O(p564).
undefined
4> c(p564,[debug_info]).
{ok,p564}
5> O(p564).
true
6>
答案 1 :(得分:4)
一种方法是使用beam_lib:chunks/2
function检查波束文件中是否有非零大小的抽象代码块。例如,给定一个名为x.beam
的波束文件,您可以从Linux / UNIX / OS X shell执行此检查,如下所示(请注意$
是我的shell提示符,我打破了这个多行,以便在这里阅读更容易,但你可以把它全部放在一行 - 它可以任意方式):
$ erl -noinput -eval 'io:format("~s\n",
[case beam_lib:chunks(hd(init:get_plain_arguments()), ["Abst"]) of
{ok,{_,[{"Abst",A}]}} when byte_size(A) /= 0 -> "yes";
_ -> "no" end])' -s init stop -- x.beam
这将检查具有标识"Abst"
的块的beam文件,并检查其关联的二进制数据是否为非零大小。如果是,则打印yes
,否则打印no
。
下面是一个使用它的示例,我们首先使用调试信息进行编译,检查beam文件,然后在没有调试信息的情况下进行编译,然后再次检查:
$ erlc +debug_info x.erl
$ erl -noinput -eval 'io:format("~s\n",
[case beam_lib:chunks(hd(init:get_plain_arguments()), ["Abst"]) of
{ok,{_,[{"Abst",A}]}} when byte_size(A) /= 0 -> "yes";
_ -> "no" end])' -s init stop -- x.beam
yes
$ erlc +no_debug_info x.erl
$ erl -noinput -eval 'io:format("~s\n",
[case beam_lib:chunks(hd(init:get_plain_arguments()), ["Abst"]) of
{ok,{_,[{"Abst",A}]}} when byte_size(A) /= 0 -> "yes";
_ -> "no" end])' -s init stop -- x.beam
no