Pretty-print Elixir исходный код от блока Dbgi - PullRequest
7 голосов
/ 03 апреля 2019

Если у меня есть файл луча, скомпилированный из кода Эрланга с debug_info, распечатать соответствующий исходный код довольно просто:

{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?

1 Ответ

3 голосов
/ 07 апреля 2019

Существует расширение Visual Studio , которое может де-кодировать файл BEAM в исходный код Elixir:

Чтобы активировать расширение, выберите «Разобрать BEAM» в контекстном меню.для файла .beam в обозревателе:

enter image description here

Следующие ссылки:

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

Редактировать 1: --

ElixirLS - еще один инструмент для отладки кода Elixir или Erlang.

Ваши скомпилированные модули .beam не имеют необходимыхвызовы функций для отправки этих сообщений.На других языках вы можете скомпилировать две версии ваших двоичных файлов, одну с вызовами отладки, а другую без, но в Elixir это работает немного по-другому.

Когда вы компилируете модули Erlang или Elixir с :debug_infoЕсли выбран этот параметр, полученные .beam-файлы содержат фрагмент с представлением Erlang Abstract Format вашего кода.Прежде чем вы сможете отладить модуль, вы должны «интерпретировать» его, вызвав :int.ni/1, который читает этот фрагмент, а затем очищает модуль.После этого любые будущие вызовы модуля обрабатываются путем оценки абстрактных форм Эрланга и выполнения необходимых вызовов мета-процесса после каждой оценки.

Вызов :int.ni/1 для каждого модуля в вашем проекте вручную является трудной задачей.поэтому, когда вы запускаете задачу Mix в отладчике ElixirLS, он автоматически интерпретирует все модули в вашем проекте и его зависимости.Это хороший вариант по умолчанию для большинства проектов, хотя он может вызвать заметную задержку при запуске задачи.Будущие версии 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

...