2010-05-19 4 views
2

Je voulais tracer toutes les fonctions dans un module erlang, avec dbg:tpl, mais l'une des fonctions internes occupait 95% du fichier de trace. J'ai alors voulu exclure seulement cette fonction unique et ai trouvé que ce n'était pas aussi facile que je pensais que ce serait.Comment tracer toutes les fonctions d'un module Erlang sauf une?

Je sais qu'il existe d'excellentes possibilités de correspondance de motifs pour les arguments lors du traçage.

  • Est-il possible d'appliquer également pattern matching pour les fonctions?

    eg.: {'=/=', '$2', function_name}

Je suis ouvert pour des solutions hors-the-box ainsi!

Merci!

Répondre

5

Il peut être réalisé comme une instruction avec une compréhension de la liste:

[dbg:tpl(Mod, F, []) || {F, _Ar} <- Mod:module_info(functions), not lists:member(F, DontTrace)]. 

Mod est le module que vous voulez tracer sur et DontTrace une liste des noms de fonctions qui ne doivent pas être tracées sur.

+0

La solution finale était: >>> [dbg: ctp (Mod, F, []) || F <- [dontTrace1, dontTrace2, dontTrace3]]. <<< Je l'ai utilisé car je voulais savoir immédiatement si je me trompais de nom de fonction. – cdlf

+0

Ah, j'ai mis à jour le code pour réellement tracer au lieu d'effacer. :-) –

1
dbg:tpl(mod,[]). 
dbg:ctpl(mod,notthisfunction). 

N'avez pas testé cela, mais cela ne devrait-il pas faire l'affaire? Je ne connais pas de moyen de le faire en une ligne.

+0

C'est définitivement prometteur! Toujours pas un seul doublure, mais la version la plus courte que j'ai encore. Problème si je veux désactiver le traçage sur 5 fonctions, je vais devoir utiliser dbg: ctpl 5 fois ... – cdlf

Questions connexes