À l'aide de la trace et de dbg en Erlang
Je suis en train de commencer à utiliser erlang:trace/3 et le dbg module de tracer le comportement d'un système de production réel sans prendre le serveur.
La la documentation est opaque (c'est un euphémisme) et il ne semble pas du tout utile tutoriels en ligne.
Ce que j'ai passé toute la journée à essayer de faire, c'était de capturer ce qui se passait dans une fonction particulière, en essayant d'appliquer une trace de module:fonction à l'aide de dbg:c et dbg:p, mais sans aucun succès...
Quelqu'un a une explication succincte de la façon d'utiliser le suivi en direct dans un Erlang système?
Vous devez vous connecter pour publier un commentaire.
Si vous préférez un graphique traceur puis essayez erlyberly. Il vous permet de sélectionner les fonctions que vous souhaitez trace (sur tous les processus à l'instant) et qui traite avec le dbg API.
Cependant, il ne protège pas contre la surcharge n'est donc pas adapté pour les systèmes de production.
Les étapes de base de suivi pour les appels de fonction sont sur un non-nœud:
Vous pouvez tracer plusieurs fonctions en même temps. Ajouter des fonctions en appelant
tp
pour chaque fonction. Si vous souhaitez suivre pour les non-fonctions exportées, vous devez appelertpl
. Pour supprimer des fonctions, appelctp
ouctpl
d'une manière similaire. En général, certains tp appels sont:Le dernier argument est un match de spécification. Vous pouvez jouer avec des qu'en utilisant
dbg:fun2ms
.Vous pouvez sélectionner le processus de trace sur l'appel à p(). Les éléments sont décrits dans la erlang:trace. Certains appels sont:
Je suppose que vous n'aurez plus jamais besoin d'appeler directement
erlang:trace
, commedbg
fait à peu près tout pour vous.Une règle d'or pour un live nœud est de générer une quantité de trace de la sortie de la coquille, qui vous permet de taper
dbg:stop_clear().
. 🙂J'ai souvent utiliser un traceur qui l'auto-stop, lui-même, après un certain nombre d'événements. Par exemple:
Si vous êtes à la recherche pour le débogage sur les nœuds distants (ou plusieurs nœuds), recherche pour
pan
,eper
,inviso
ouonviso
.dbg:n(Node)
met en placeNode
pour le même type de suivi que le nœud que vous êtes sur.Sur des systèmes informatiques que nous avons rarement trace sur la coque.
Si le système est bien configuré, il est déjà à la collecte de votre Erlang journaux qui ont été imprimés à la coque. J'ai pas besoin de souligner pourquoi il est essentiel de n'importe quel nœud...
Permettez-moi d'insister sur la recherche de fichiers:
Il est possible de tracer une ligne de fichier, ce qui va produire une sortie binaire qui peut être converti et analysées plus tard. (pour une analyse plus approfondie ou automatiques, système de contrôle, etc.)
Un exemple pourrait être:
Trace de plusieurs fichiers enveloppé (12x50 Mo).Veuillez toujours vérifier l'espace disque disponible avant d'utiliser une grosse trace!
dbg:p(all,[call,timestamp,return_to]).
Cela dit, nous allons avoir un coup d'oeil à une base de traçage de la séquence de commande:
<1>
dbg:stop_clear().
<2>
dbg:tracer().
<3>
dbg:p(all,[call, timestamp]).
<4>
dbg:tp( ... ).
<5>
dbg:tpl( ... ).
<42>
dbg:stop_clear().
Vous pouvez:
ajouter des déclencheurs par la définition de certains fun()-s dans le shell pour arrêter le suivi à un moment donné ou à un événement. Récursive fun()-s sont les meilleurs pour atteindre cet objectif, mais être très prudent lors de l'application de celles-ci.
appliquer une grande variété de pattern matching pour s'assurer que vous ne trace pour le processus spécifique de la spécificité de l'appel de fonction, le type d'arguments...
J'ai eu un problème un moment en arrière, lorsque nous avons eu à vérifier le contenu d'un ETS de la table et sur l'apparition d'une certaine entrée, nous avons dû arrêter la trace dans les 2-3 minutes.
Je suggère également le livre Erlang de Programmation écrit par Francesco Cesarini. (Erlang Programmation @ Amazon)
Le " dbg " module est assez bas niveau de stuff. Il y a deux hacks que j'utilise très
souvent pour les tâches que j'ai souvent besoin.
Utiliser Erlang CLI/shell extension de code à http://www.snookles.com/erlang/user_default.erl. Il a été écrit à l'origine (autant que je sache) par Serge Aleynikov et
a été utile "c'est ainsi que j'ai ajouter des fonctions personnalisées à la coquille" exemple. Compiler
le module et l'édition de votre ~/.erlang fichier à point de son chemin d'accès (voir le commentaire au dessus
du fichier).
Utiliser le "redbug" de l'utilitaire fourni avec le L'EPER collection d'utilitaires.
Il est très facile à utiliser " dbg " pour créer des millions d'événements de trace en quelques secondes. Faire
ainsi, dans un environnement de production peuvent être désastreuses. Pour le développement ou de production,
redbug fait qu'il est quasiment impossible de tuer un système en cours d'exécution, avec une trace induite par la surcharge.