内核模块打印调试信息方法

内核模块打印的信息越多越好调试,但是打印越多程序运行越慢,在正式版本中更加不能添加非出错提示类信息。
添加内核参数,设置信息打印级别,可以实现在线调试。

内核参数: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

你可能感兴趣的:(linux)