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

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

内核参数:test01_print_level
初始化为不打印,需要调试时,可以提高打印级别,打印出DEBUG信息、TRACE信息等等,完成后可再降低到不打印级别。

代码如下:
<test01_modules.c>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>

#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");

<test01_module.h>
#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

<Makefile>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值