elixir

¿Herramientas de depuración y depuración en Elixir?



(6)

En Elixir 1.5 y OTP 20 hay una nueva función, Exception.blame/3 que puede agregar información de depuración a ciertas excepciones. En este momento solo es compatible con FunctionClauseErrors y solo debe usarlo en el desarrollo porque es una tarea costosa: la función recuperará las cláusulas disponibles del código de bytes y las evaluará en función de los argumentos dados. Ver comunicado

Acabo de comenzar a usar Elixir y he comenzado un proyecto de Phoenix, que disfruto mucho. Ahora, al tener fondo de rieles, estoy acostumbrado a que me estropeen con herramientas de depuración como "depurador", "byebug", etc. Me preguntaba si hay herramientas similares para Elixir. ¿Cómo están depurando sus aplicaciones Elixir?

¡Incluso un equivalente a Rubys raise my_object.inspect , haría maravillas!

Gracias


Hay una manera de depurar pruebas similares a las que hace byebug: usando el comando iex -S mix test , esto ejecutará sus pruebas y si se encuentra un IEx.pry , le preguntará si desea "detenerse" allí y analizar su contexto.

Ejemplo de código:

defmodule AppTest do def hello do test_variable = "john doe" require IEx; IEx.pry :world end end

defmodule AppTestTest do use ExUnit.Case doctest AppTest test "greets the world" do assert AppTest.hello() == :world end end

Al ejecutar la iex -S mix test , se detendrá en el require IEx; IEx.pry require IEx; IEx.pry .

Fuente: https://elixirforum.com/t/how-to-debug-exunit-tests-with-debugger/14170/4


Puede usar el módulo Quaff.Debug desde https://github.com/qhool/quaff

El módulo de depuración proporciona una interfaz auxiliar simple para ejecutar código Elixir en el depurador gráfico erlang

Lo probé hoy con Elixir 1.0.4, funciona.


Puedes usar IEx

require IEx value = {:some, :erlang, :value} IEx.pry

Si inicia este programa con, por ejemplo, iex -s program.exs (o iex -S mix para un proyecto), se le preguntará si desea permitir la intromisión en este código cuando se alcance y el value estará disponible para usted. inspección.

También puede hacer una depuración de impresión usando IO.inspect lo que le permite generar básicamente cualquier estructura de datos erlang.


Use el depurador de Erlang. Ejemplo con Phoenix 1.3 y Elixir 1.5.1, archivo fuente: ./lib/todo/api/api.ex y el nombre del módulo es: Todo.API

~/elixir/todo_app/ iex -S mix phx.server Erlang/OTP 20 [erts-9.0] [source] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false] [info] Running TodoWeb.Endpoint with Cowboy using http://0.0.0.0:4000 Interactive Elixir (1.5.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> :debugger.start() {:ok, #PID<0.373.0>} iex(2)> :int.ni(Todo.API) {:module, Todo.API}

En el depurador de Erlang:

  • El panel izquierdo en la ventana Monitor muestra el módulo cargado.
  • El menú Módulo, el elemento inferior muestra el módulo cargado con un submenú ''Ver'' y ''Eliminar''. Use el menú Ver para ver la fuente con números de línea.
  • Para colocar un punto de interrupción, use el menú Salto, Saltos de línea ...
  • Ejecute su programa hasta que se detenga en la línea especificada. La ventana Monitor muestra un proceso con el estado ''break''. Haga doble clic en esta línea para abrir el proceso adjunto en el depurador. Aquí puede avanzar, pasar (siguiente), continuar, subir, inspeccionar valores, etc. Para ingresar a otro módulo, también debe cargarse como se indica arriba.
  • Se ignorará un punto de interrupción si no se coloca correctamente. Si tiene una tubería multilínea, coloque el punto de interrupción en la última línea.

Depuración de aplicaciones Cowboy y aplicaciones Phoenix.

Vi esta publicación en el Elixir rader http://www.jessetrimble.net/iex-pry-elixir , y pensé en resumirla aquí, ya que es extremadamente conveniente :-).

En las aplicaciones Rails (y otras), simplemente puede poner la etiqueta del depurador en su controlador, y cuando se activa la ruta, se romperá en la etiqueta del depurador.

Al usar palanca en Phoenix, lo anterior dará como resultado

Cannot pry #PID<0.259.0> at web/controllers/posts_controller.ex:8. Is an IEx shell running?

Resulta que el proceso Phoenix debe ejecutarse dentro de una sesión IEx, esto se hace como tal

iex -S mix phoenix.server

Ahora en cambio verás

Request to pry #PID<0.266.0> at web/controllers/posts_controller.ex:9. Allow? [Yn]