I see that I need to compile an .erl
file withdebug_info
parameter to make it possible to debug it in the debugger.
When I try to debug a .beam
file in the debugger, I always see that the file has no debug information and can not be opened.
** Invalid beam file or no abstract code: "/erlang-debug/myapp.beam"
I suspect it can be that I compile the files in a wrong way. I tried all the possible way but still no luck and I feel like files are compiled without debug_info.
One of the simplest examples I used is mentioned on Erlang documentation page:
% erlc +debug_info module.erl
Is there a way to know if some specific .beam
file is compiled with debug_info or not?
You have access to all the compilation option using the module_info function. To make a test on the debug info flag, you can use the proplists function to extract the information:
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>
One way is to use the beam_lib:chunks/2
function to check the beam file for an abstract code chunk of non-zero size. For example, given a beam file named x.beam
, you can perform this check from a Linux/UNIX/OS X shell as shown below (note that the $
is my shell prompt, and I broke this across multiple lines to make it easier to read here but you could put it all on a single line as well — it works either way):
$ 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
This examines the beam file for a chunk with the id "Abst"
and checks that its associated binary data is of non-zero size. If so, it prints yes
, else it prints no
.
Below is an example of using it, where we first compile with debug info, check the beam file, then compile without debug info, and check it again:
$ 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With