¿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]