一種方法是使用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
。
下面是一個使用它,在這裏我們先用調試信息進行編譯,檢查束文件,然後在沒有調試信息編譯,並重新進行檢查的例子:
$ 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
Pascal與module_info的方式更爲清晰。 –