内核模块打印的信息越多越好调试,但是打印越多程序运行越慢,在正式版本中更加不能添加非出错提示类信息。
添加内核参数,设置信息打印级别,可以实现在线调试。
内核参数:test01_print_level
初始化为不打印,需要调试时,可以提高打印级别,打印出DEBUG信息、TRACE信息等等,完成后可再降低到不打印级别。
代码如下:
#include
#include
#include
#include "test01_module.h"
int test01_print_level = NOPRN_LEVEL;
module_param(test01_print_level, int, 0644);
MODULE_PARM_DESC(test01_print_level, "test print level");
struct timer_list test01_timer;
static void test01_sleep_timeout(int data)
{
DEBUG("print level %d\n", data);
test01_timer.data = test01_print_level;
mod_timer(&test01_timer, jiffies + 5 * HZ);
}
int __init test01_module_init(void)
{
TRACE("IN.\n");
init_timer(&test01_timer);
test01_timer.expires = jiffies + 5* HZ;
test01_timer.data = test01_print_level;
test01_timer.function = test01_sleep_timeout;
add_timer(&test01_timer);
TRACE("OUT.\n");
return 0;
}
void __exit test01_module_exit(void)
{
TRACE("IN.\n");
del_timer_sync(&test01_timer);
TRACE("OUT.\n");
return;
}
module_init(test01_module_init);
module_exit(test01_module_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION("1.0");
#ifndef _TEST01_MODULE_H_
#define _TEST01_MODULE_H_
#define NOPRN_LEVEL 0
#define DEBUG_LEVEL 1
#define TRACE_LEVEL 2
#define ALLPRN_LEVEL 3
extern int test01_print_level;
#define DEBUG(args...) \
do { \
if (test01_print_level >= DEBUG_LEVEL){ \
printk("\nFILE: %s, FUNC: %s, LINE: %d -- ", __FILE__, __FUNCTION__, __LINE__); \
printk(args); \
} \
}while(0)
#define TRACE(args...) \
do { \
if (test01_print_level >= TRACE_LEVEL){ \
printk("\nFILE: %s, FUNC: %s, LINE: %d -- ", __FILE__, __FUNCTION__, __LINE__); \
printk(args); \
} \
}while(0)
#endif
ifneq ($(KERNELRELEASE),)
export EXTRA_CFLAGS := -I$(PWD)/../include/
# second run in kernel dir
obj-m := $(MODNAME).o
$(MODNAME)-objs = $(LOCOBJS)
else
# first run in module dir
KDIR := /usr/src/kernels/2.6.32-220.el6.x86_64/
PWD:= $(shell pwd)
SRCS := $(shell echo *.c)
LOCOBJS := $(SRCS:.c=.o)
MODNAME = $(shell basename `pwd`)
export LOCOBJS
export MODNAME
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.o *.ko* .*.mod.c .*.cmd *.mod.c *.o.p *.order *.symvers
rm -rf .tmp_versions
install:
cp -f *.ko ../../build_dir/
endif