如何知道.beam文件是否使用debug_info编译?

时间:2016-07-17 16:07:17

标签: erlang

我发现需要使用.erl参数编译debug_info文件,以便在调试器中对其进行调试。

当我尝试在调试器中调试.beam文件时,我总是看到该文件没有调试信息且无法打开。

  

**无效的光束文件或无抽象代码:" /erlang-debug/myapp.beam"

我怀疑可能是我以错误的方式编译文件。 我尝试了所有可能的方式,但仍然没有运气,我觉得文件是在没有debug_info的情况下编译的。

Erlang documentation page上提到了我使用过的最简单的一个例子:

% erlc +debug_info module.erl

有没有办法知道某个特定的.beam文件是否使用debug_info编译?

2 个答案:

答案 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