[英]Pretty-print Elixir source code from Dbgi chunk
如果我有一個使用debug_info
從Erlang代碼編譯的beam文件,打印相應的源代碼相當簡單:
{ok, {_, [{debug_info, {debug_info_v1, erl_abstract_code, AbstractCode}}]}} =
beam_lib:chunks("my_module.beam", [debug_info]).
{ok, Forms} = erl_abstract_code:debug_info(erlang_v1, module_name, AbstractCode, []).
io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(Forms))]).
但是Elixir怎么樣? 我可以像這樣做前兩個步驟:
{ok, {_, [{debug_info, {debug_info_v1, elixir_erl, AbstractCode}}]}} =
beam_lib:chunks("Elixir.MyModule.beam", [debug_info]).
{ok, Forms} = elixir_erl:debug_info(elixir_v1, module_name, AbstractCode).
這給出了這種形式的地圖:
#{attributes => ...,
compile_opts => [],
definitions => ...,
deprecated => [],
file => <<"my_module.ex">>,
line => 95,
module => 'Elixir.MyModule',
unreachable => []}
如何將其打印為人類可讀的Elixir代碼?
有一個Visual Studio 擴展可以將BEAM文件解碼為Elixir源代碼:
要激活擴展,請在資源管理器視圖中從.beam文件的上下文菜單中選擇“Disassemble BEAM”:
以下參考:
1) https://elixirforum.com/t/visual-studio-code-extension-to-view-beam-files/13373/4
2) http://beam-wisdoms.clau.se/en/latest/indepth-beam-file.html
ElixirLS是另一種調試Elixir或Erlang代碼的工具。
您編譯的.beam模塊沒有必要的函數調用來發送這些消息。 在其他語言中,您可以編譯兩個版本的二進制文件,一個使用調試調用,另一個沒有,但在Elixir中,它的工作方式略有不同。
當您使用
:debug_info
選項集編譯Erlang或Elixir模塊時,生成的.beam文件包含一個帶有代碼的Erlang抽象格式表示的塊。 在調試模塊之前,必須通過調用:int.ni/1
來“解釋”它,它會讀取此塊然后清除模塊。 之后,通過評估Erlang抽象表單並在每次評估后對元進程進行必要的調用來處理對模塊的任何未來調用。手動調用
:int.ni/1
中每個模塊的:int.ni/1
,因此當您在ElixirLS調試器中運行Mix任務時,它會自動解釋項目中的所有模塊及其依賴項。 對於大多數項目來說,這是一個很好的默認設置,但它可能會導致啟動任務時出現明顯的延遲。 ElixirLS的未來版本可能包含更多配置選項,以指定要解釋的模塊。注意:由於必須在調試之前解釋模塊,因此無法調試任何位於模塊定義之外的代碼。
重要鏈接:
1) https://medium.com/@JakeBeckerCode/debugging-elixir-in-vs-code-400e21814614
2) http://blog.plataformatec.com.br/2016/04/debugging-techniques-in-elixir-lang/
3) https://zorbash.com/post/debugging-elixir-applications/#otp-behaviour-tracing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.