Linux调试方式之动态打印(module_param_named)
内核版本 | Linux4.4 |
---|---|
作者 | nineyole |
module_param_named分析
在很多时候,我们需要记录一些调试信息,如果每次都用printk打印,会有很多无用代码,因此可以调用如下代码来申明一个变量。
module_param_named(dbg_level, dbg_enable, int, 0644);
其中module_param_named定义如下:
#define module_param_named(name, value, type, perm) \
param_check_##type(name, &(value)); \
module_param_cb(name, ¶m_ops_##type, &value, perm); \
__MODULE_PARM_TYPE(name, #type)
上面的函数主要有以下几个说明:
1、调用param_check_##type方法,##用于连接两个字符,如果type是int,也就说说执行param_check_int,主要作用就是检查变量是不是int 类型
2、调用module_param_cb,针对int类型就是param_ops_int
3、最后调用__MODULE_PARM_TYPE方法指定我们的type也就是int,#的用法在我上面提到的专栏文章中也已经说到
这样一来,可以很清楚的理解了,不过需要注意的是module_param_cb这个方法有时还是不可或缺的,就像上面我们不只是要进行参数检查。
module_param_named使用案例
static int dbg_enable;
module_param_named(dbg_level, dbg_enable, int, 0644);
#define DBG(args...) \
do { \
if (dbg_enable) { \
pr_info(args); \
} \
} while (0)
通过上面的之后,就会在/sys/module/${modulename}/parameters/目录下创建一个内核模块,然后可以使用
echo -n > /sys/module/value>/sys/module/ {modulename}/parameters/${parm}"命令修改其对应的参数,从而实现参数打印。
比如对电量计cw2015或者bq25703的相关驱动就可以使用下面的方式来动态调整打印日志。
echo 1 >/sys/module/cw2015_battery/parameters/dbg_level
echo 1 > sys/module/bq25700_charger/parameters/dbg_level