2016-07-17 78 views
2

我看到我需要使用debug_info參數編譯.erl文件,以便在調試器中對其進行調試。如何知道.beam文件是否使用debug_info編譯?

當我嘗試調試調試器中的.beam文件時,我總是看到該文件沒有調試信息,無法打開。

**無效束文件或沒有抽象代碼:「/erlang-debug/myapp.beam」

我懷疑這可能是我編譯錯誤的方式的文件。 我嘗試了所有可能的方式,但仍然沒有運氣,我覺得文件編譯時沒有debug_info。

一個我用Erlang documentation page提到最簡單的例子:

% erlc +debug_info module.erl 

有沒有辦法知道,如果某些特定.beam文件編譯DEBUG_INFO與否?

回答

4

一種方法是使用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 
+0

Pascal與module_info的方式更爲清晰。 –

5

您可以訪問所有的編譯選項使用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> 
相關問題