web-dev-qa-db-fra.com

Outils de débogage et de débogage dans Elixir?

Je viens de commencer à utiliser Elixir et j'ai lancé un projet Phoenix, que j'apprécie beaucoup. Maintenant, en ayant Rails background, j'ai l'habitude d'être gâté avec des outils de débogage comme "debugger", "byebug" et ainsi de suite; je me demandais s'il existe des outils similaires pour Elixir? Comment vous déboguez vos applications Elixir?

Même un équivalent à Rubys raise my_object.inspect, ferait des merveilles!

Merci

63
MartinElvar

Vous pouvez utiliser IEx

require IEx

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

Si vous démarrez ce programme avec par exemple iex -s program.exs (ou iex -S mix pour un projet), il vous sera demandé si vous souhaitez autoriser le code dans ce code lorsqu'il sera atteint et value sera disponible pour inspection.

Vous pouvez également simplement effectuer le débogage d'impression en utilisant IO.inspect vous permettant de générer essentiellement n'importe quelle structure de données erlang.

72
Paweł Obrok

Débogage des applications Cowboy et des applications Phoenix.

J'ai vu ce post dans le rader Elixir http://www.jessetrimble.net/iex-pry-elixir , et j'ai pensé que je le résumerais ici, car c'est extrêmement pratique :-).

Dans Rails applications (et autres), vous pouvez simplement mettre la balise de débogage dans votre contrôleur, et lorsque le chemin est déclenché, il se cassera à la balise de débogage.

Lorsque vous utilisez Pry à Phoenix, ce qui précède entraînera

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

Il s'avère que le processus Phoenix doit s'exécuter dans une session IEx, cela se fait en tant que tel

iex -S mix phoenix.server

Maintenant, à la place, vous verrez

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

Vous pouvez utiliser Quaff.Debug module de https://github.com/qhool/quaff

Le module de débogage fournit une interface d'aide simple pour exécuter le code Elixir dans le débogueur graphique erlang

Je l'ai testé aujourd'hui avec Elixir 1.0.4, ça marche.

10
Julien Lirochon

Utilisez le débogueur Erlang. Exemple avec Phoenix 1.3 et Elixir 1.5.1, fichier source: ./lib/todo/api/api.ex et le nom du module est: 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}

Dans le débogueur Erlang:

  • Le panneau gauche de la fenêtre Moniteur montre le module chargé.
  • Le menu Module, l'élément du bas montre le module chargé avec un sous-menu "Afficher" et "Supprimer". Utilisez le menu Affichage pour voir la source avec les numéros de ligne.
  • Pour placer un point d'arrêt, utilisez le menu Saut, Sauts de ligne ...
  • Exécutez votre programme jusqu'à ce qu'il s'arrête à la ligne spécifiée. La fenêtre Moniteur affiche un processus avec le statut "pause". Double-cliquez sur cette ligne pour ouvrir le processus attaché dans le débogueur. Ici, vous pouvez passer, passer (suivant), continuer, monter, inspecter les valeurs, etc. Pour entrer dans un autre module, il doit également être chargé comme ci-dessus.
  • Un point d'arrêt sera ignoré s'il n'est pas correctement placé. Si vous disposez d'un pipeline multiligne, placez le point d'arrêt sur la dernière ligne.
2
N. Hoogervorst

Dans Elixir 1.5 et OTP 20, il y a une nouvelle fonction Exception.blame/3 qui peut ajouter des informations de débogage à certaines exceptions. Il ne prend en charge que FunctionClauseErrors pour le moment et vous ne devez l'utiliser qu'en développement car c'est une tâche coûteuse: la fonction récupérera les clauses disponibles du bytecode et les évaluera par rapport aux arguments donnés. Voir communiqué

1
Cyzanfar

Il existe un moyen de déboguer des tests similaires à ceux de byebug: à l'aide de la commande iex -S mix test, cela exécutera vos tests et si un IEx.pry a été rencontré, il vous demandera si vous voulez "vous arrêter" et analyser son contexte.

Exemple de code:

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

Fonctionnement iex -S mix test il s'arrêtera dans le require IEx; IEx.pry.

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

0
Mateus Luiz