In rule-testing mode the -d
rule-testing command
can be used to turn debugging output on and off.
Prior to V8.7 sendmail the -d
could be specified only
on the command line. Beginning with V8.7 sendmail, the -d
may also be specified in rule-testing mode. We illustrate the latter
technique here.
Debugging output can reveal in great detail how individual rules are being handled.
A debugging category and level of 21.12
,
for example, causes sendmail to print the LHS of each rule as
it is tried.
To illustrate, consider the following (highly simplified) configuration-file
rule set:
S0 R@ $#local $:$n handle <> form R$*<@$+>$* $#$M $@$R $:$1<@$2>$3 user@some.where R$+ $#local $:$1 local names
Normal output that is produced when a rule-set number and address are
entered at the >
prompt looks like this:
>0 george
rewrite: ruleset 0 input: george rewrite: ruleset 0 returns: $# local $: george
But if we turn on debugging using the -d
rule-testing command:
>-d21.12
the output that is produced when the same rule-set number and address are entered is more verbose than it was before:
>0 george
rewrite: ruleset 0 input: george ---trying rule: @ --- rule fails ---trying rule: $* < @ $+ > $* --- rule fails ---trying rule: $+ ---rule matches: $# local $: $1 rewritten as: $# local $: george rewrite: ruleset 0 returns: $# local $: george
Observe that the first rule in rule set 0 (the lone @
)
does not match george
in the workspace. Therefore that rule
fails
and is skipped. Then the more complicated
rule ($*<@$+>$*
) is tried, and it too fails.
Finally, the $+
operator in the
last rule matches george
, and the workspace is rewritten.
Note that the extra output that is produced by -d
can potentially
run to many lines.
To capture the
output for later examination, consider running sendmail in
rule-testing mode from within a script(1), emacs(1), or
similar session.
Higher levels of debugging are also available for examining rules and
rule sets. The level -d21.15
shows $
digit
operators
on the RHS being substituted with values from the LHS. The level
-d21.35
causes each comparison, token versus token, to
be printed.
To turn off the extra debugging output, just reuse the -d
rule-testing
command and specify a level of zero:
>-d21.0
A -d
with no category or level behaves the same as
the -d
command-line switch (see Section 37.1, "The Syntax of -d"). It sets
a default of 0-99.1
.
In debugging large configuration files, the output that is produced
by the -d21.15
switch can become too huge to examine
conveniently. A good alternative (when modifying or adding
rules) is to temporarily insert a fake subroutine call before
and after individual rules to see what they do:
R$* $:$>TEST $1 fake subroutine call Rlhs rhs new rule R$* $:$>TEST $1 fake subroutine call
With the fake wrapper around the new rule (the name TEST
is
arbitrary), ordinary rule testing
with -bt
now shows how the address is rewritten by that rule:
rewrite: ruleset 3 input: ... rewrite: ruleset TEST input: ... rewrite: ruleset TEST returns: ... new rule acted here rewrite: ruleset TEST input: ... rewrite: ruleset TEST returns: ... rewrite: ruleset 3 returns: ... >
If you use this technique, remember, of course, to remove the fake subroutine calls before putting that configuration file into use.