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 [email protected] 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 georgerewrite: 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 georgerewrite: 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 $1fake 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.