Le mode -bt vu précédemment est suffisant pour détecter la majeure partie des problèmes. Toutefois, il existe certains cas où il faut faire appel à des diagnostics plus élaborés. Le programme sendmailest très complet dans ce domaine, puisqu'il est capable de tracer un grand nombre d'actions.
Il y a un grand nombre de niveaux de debug, mais les plus immédiatement utiles sont :
Niveau Signification 21.1 affiche l'adresse en cause en cas de récursion infinie 21.2 affiche les adresses à l'entrée et à la sortie d'un ensemble, ainsi que les variables demandant une évaluation lors de l'expansion 21.3 affiche les adresses lors des appels aux ensembles 21.4 affiche les adresses réécrites par les ensembles 21.10 affiche les règles non utilisées 21.15 visualise le comportement de l'algorithme 21.35 affiche la reconnaissance de l'adresse en fonction de la partie gauche des règles 21.36 affiche en détail la reconnaissance de l'adresse
En pratique, le niveau -d21.2 permet de suivre l'envoi d'un courrier et le niveau -d21.15 permet d'analyser le fonctionnement des règles de réécriture. Par exemple2.5 :
soleil# /usr/lib/sendmail -C $HOME/sendmail.cf.new -d21.2 pda From: pda To: pda essai ^D
provoque l'affichage de
rewrite: ruleset 3 input: pda rewrite: ruleset 19 input: pda rewrite: ruleset 19 input: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 3 returns: pda < @ . LOCAL > rewrite: ruleset 0 input: pda < @ . LOCAL > rewrite: ruleset 0 returns: $# local $: pda rewrite: ruleset 4 input: pda rewrite: ruleset 4 returns: pda rewrite: ruleset 3 input: pda rewrite: ruleset 19 input: pda rewrite: ruleset 19 input: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 3 returns: pda < @ . LOCAL > rewrite: ruleset 1 input: pda < @ . LOCAL > rewrite: ruleset 17 input: pda < @ . LOCAL > rewrite: ruleset 17 returns: Pierre . David < @ . LOCAL > rewrite: ruleset 1 returns: Pierre . David < @ . LOCAL > rewrite: ruleset 4 input: Pierre . David < @ . LOCAL > rewrite: ruleset 4 returns: Pierre . David rewrite: ruleset 3 input: pda rewrite: ruleset 19 input: pda rewrite: ruleset 19 input: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 19 returns: pda < @ . LOCAL > rewrite: ruleset 3 returns: pda < @ . LOCAL > rewrite: ruleset 0 input: pda < @ . LOCAL > rewrite: ruleset 0 returns: $# local $: pda rewrite: ruleset 2 input: pda rewrite: ruleset 2 returns: pda rewrite: ruleset 20 input: pda rewrite: ruleset 20 returns: pda rewrite: ruleset 4 input: pda rewrite: ruleset 4 returns: pda
La première série correspond à la sélection de l'agent de transport à l'aide de l'adresse figurant dans l'enveloppe (c'est-à-dire l'argument de sendmail). La deuxième série montre la réécriture de l'adresse de l'expéditeur et la troisième l'adresse du destinataire.
Le niveau -d21.15 détaille très finement le fonctionnement de l'algorithme des règles de réécriture. Par exemple :
soleil$ /usr/lib/sendmail -C $HOME/sendmail.cf.new -bt -d21.15 ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 1 pda<@.LOCAL> rewrite: ruleset 1 input: pda < @ . LOCAL > -----trying rule: $* -----rule matches: $: $> 17 $1 $1: 7b033de4="pda" 7b033de8="<" 7b033dea="@" 7b033dec="." 7b033dee="LOCAL" 7b033df4=">" -----callsubr 17 rewrite: ruleset 17 input: pda < @ . LOCAL > -----trying rule: $* < @ $+ . LOCAL > $* ----- rule fails -----trying rule: $* < @ $* . LOCAL > $* -----rule matches: $@ $( revaliases $1 $) < @ $2 . LOCAL > $3 $1: 7b033de4="pda" $2: $3: rewritten as: Pierre . David < @ . LOCAL > rewrite: ruleset 17 returns: Pierre . David < @ . LOCAL > rewritten as: Pierre . David < @ . LOCAL > rewrite: ruleset 1 returns: Pierre . David < @ . LOCAL > >
Pour ne pas trop alourdir l'exemple, l'ensemble de règles numéro
1 est directement appelé
avec une adresse en forme canonique (pda<@.LOCAL>
). Cet
ensemble 1 reconnaît le motif $*
, et donc appelle l'ensemble 17.
Dans ce nouvel ensemble, la première règle échoue, la deuxième réussit,
et la réécriture conduit à l'adresse finale.
Il existe de nombreux autres catégories et niveaux de debug. Les catégories sont listées dans les sources de sendmail(fichier src/TRACEFLAGS).