一种方法是使用beam_lib:chunks/2 function 检查Beam 文件中是否存在非零大小的抽象代码块。例如,给定一个名为 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
这将检查 id 为 "Abst" 的块的光束文件,并检查其关联的二进制数据的大小是否非零。如果是,则打印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