热度 1||
在调试程序时,输出调试信息是一种普遍、有效的方法。输出调试信息一般有以下五种方法:
方法一:直接使用屏幕打印函数print。
该方法直接在需要输出调试信息的位置使用函数printf输出相应的调试信息,以及某些关键变量的值。
为了避免方法一的缺点,可以利用条件编译技术,自定义调试函数debug。当程序正式发布的编译时取消宏定义__DEBUG__,在正式发布的程序中就不会输出调试信息。若又出现bug,只要重新在编译程序时定义宏__DEBUG__即可恢复原来的调试信息输出。可以在编写程序时就有目的事先插入些调试语句,这将有益于调试程序。另外,可以根据需要编写函数debug,将调试信息输出到除屏幕以外的其它地方,如文件或syslog服务器等。
该方法的缺点是(1)调试信息要么全部输出,要么全不输出;(2)要重新输出调试信息时需要重新编译程序。
方法三:含调试等级的自定义调试函数debug。
可以继续改进方法,避免方法二中的缺点。我们可以根据调试信息的细节程度,将调试信息分成不同的等级。调试信息的等级必须大于0,若调试信息细节程度越高,则等级越高。在输出调试信息时,若调试等级高于调试信息等级才输出调试信息,否则忽略该调试信息。当调试等级为0时,则不输出任何调试信息。
这样,在正式发布版中包含调试信息也无伤大雅了,因为只需将调试等级配置为0,将不会出现任何调试信息。
该方法的缺点是效率不太高,因为不管调试信息是否需要输出,都会进行一次函数调用。若不需要输出调试信息,这次函数调用就多余了。
方法四:调试等级的判断放在自定义调试函数debug之外。
为了减少不必要的函数调用,可以用宏定义将调试等级的判断放在函数debug之外
调试等级的判断放在自定义调试函数debug之外
这种方法对于不需要输出的高等级的调试信息操作来说,仅仅多了个两个整数之间的大小判断。在正式的程序运行时,效率是有所提高的。
但这种调试信息输出的方法依然不够完美。对于一个大项目,一般分为若干个模块,bug将会定位到某个或某几个模块。若整个项目的调试信息都输出,信息量将会非常大,也容易干扰调试人员的思维。这时,我们需要的是只输出我们关心的那些模块的调试信息,但该方法并不能达到我们的要求。它只能根据调试等级输出信息,对于同一调试等级的信息要么全输出,要么全不输出。
方法五:根据不同的功能模块分别定义不同的调试等级。
在squid[1]中,定义了以下的功能模块调试等级变量和调试函数:
int debugLevels[MAX_DEBUG_SECTIONS];然后在程序中如下使用它:
debug(17, 3) ("fwdStateFree: %p/n", fwdState);上述调试函数很灵活,可以在不同的模块中定义有不同的调试等级,当需要调试某功能时,只需将该模块的调试等级定义为相应的等级,就可输出需要的调试信息。
========================================================|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )
GMT+8, 2024-11-25 04:46 , Processed in 0.055109 second(s), 18 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.