分类: 嵌入式
2011-09-21 11:03:39
对于驱动程序设计来说,核心问题之一就是如何完成调试。当前常用的驱动调试技
术可分为:
• 打印调试
• 调试器调试
• 查询调试
在调试应用程序时,最常用的调试技术是打印,就是在应用程序中合适的点调用printf。当调试内核代码的时候,可以用printk完成类似任务。
在驱动开发时,printk 非常有助于调试。但当正式发行驱动程序时, 应当去掉这些打印语句。但你有可能很快又发现,你又需要在驱动程序中实现一个新功能(或者修复一个bug),这时你又要用到那些被删除的打印语句。这里介绍一种使用printk 的合理方法,可以全局地打开或关闭它们,而不是简单地删除。
#ifdef PDEBUG
#define PLOG(fmt,args...) printk(KERN_DEBUG"scull:"fmt,##args)
#else
#define PLOG(fmt,args...) /*do nothing */
#endif
Makefile作如下修改:
DEBUG =y
ifeq ($(DEBUG),y)
DEBFLAGS =-O2 -g -DPDEBUG
else
DEBFLAGS =-O2
endif
CFLAGS +=$(DEBFLAGS)
实例:
/*
* 输出调试信息
* Lzy 2011-9-26
*/
#include
#include
#define DEBUG_SWITCH 1 /*1:输出 0:不输出*/
#if DEBUG_SWITCH
#define P_DEBUG(fmt,args...) printk("
#else
#define P_DEBUG(fmt,args...) /*do nothing */
#endif
static int hello_init(void)
{
char *name = "Lzy";
P_DEBUG( "Hello %s\n",name); /* 打印hello World */
return 0;
}
static void hello_exit(void)
{
P_DEBUG( "Goodbye, world\n"); /* 打印Goodbye,world */
}
module_init(hello_init); /* 指定模块加载函数 */
module_exit(hello_exit); /* 指定模块卸载函数 */
MODULE_LICENSE("GPL");