可以使用预处理程序符号(例如 DEBUG)或全局变量,借助条件编译将用于调试的代码插入驱动程序中。使用条件编译,可在生产驱动程序中删除不必要的代码。使用变量可以在运行时设置调试输出量。在运行时使用 ioctl 或调试程序设置调试级别可以指定输出。通常,可以组合使用这两种方法。
以下示例依赖编译器来删除无法访问的代码(在本例中是跟在始终为 false 的零测试之后的代码)。此示例还提供了可在 /etc/system 中设置或由调试程序修补的局部变量。
#ifdef DEBUG /* comments on values of xxdebug and what they do */ static int xxdebug; #define dcmn_err if (xxdebug) cmn_err #else #define dcmn_err if (0) cmn_err #endif /* ... */ dcmn_err(CE_NOTE, "Error!\n");
此方法可处理 cmn_err(9F) 具有可变数量参数的情况。另一种方法依赖于宏只有一个参数的情况,即 cmn_err(9F) 的用括号括起的参数列表。宏可以删除此参数。此宏还可在未定义 DEBUG 的情况下,通过将宏扩展为不包含任何内容来消除对优化程序的依赖性。
#ifdef DEBUG /* comments on values of xxdebug and what they do */ static int xxdebug; #define dcmn_err(X) if (xxdebug) cmn_err X #else #define dcmn_err(X) /* nothing */ #endif /* ... */ /* Note:double parentheses are required when using dcmn_err. */ dcmn_err((CE_NOTE, "Error!"));
可以采用多种方法扩展此技术。一种方法是根据 xxdebug 的值指定来自 cmn_err(9F) 的不同消息。但在此类情况下,必须注意不要用大量的调试信息使代码变得晦涩难懂。
另一种常见方案是编写 xxlog() 函数,以便使用 vsprintf(9F) 或 vcmn_err(9F) 来处理变量参数列表。