我正在尝试动态打印日志。我所做的是我有一个调试变量,我在自己的stat_my.c
文件中设置。以下是show_stat
函数。
extern int local_debug_lk;
static int show_stat(struct seq_file *p, void *v)
{
int temp=0;
if(local_debug_lk == 0)
{
seq_printf(p,"local_debug_lk=0, enabling,int_num=%d\n",int_num);
local_debug_lk=1;
}
else
{
seq_printf(p,"local_debug_lk=:%d,int_num=%d\n",local_debug_lk,int_num);
while(temp<int_num){
seq_printf(p,"%d\n",intr_list_seq[temp]);
temp++;
}
local_debug_lk=0;
int_num=0;
}
return 0;
}
int local_debug_lk, int_num;
isr_root(...){
/*
logic to extract IRQ number, saved in vect variable
*/
if(local_debug_lk && (int_num < 50000)){
intr_list_seq[int_num]=vect;
int_num++;
}
我期望的是当我执行“cat /proc/show_stat
”时,首先它将启用local_debug_lk
标志,并且每当驱动程序文件中发生中断时,它将存储在intr_list_seq[]
数组中。当我第二次执行“cat /proc/stat_my
”时,它应该打印IRQ序列并通过设置local_debug_lk=0
禁用IRQ记录。
但......发生的事情是,我总是得到
“local_debug_lk=0, enabling,int_num=0
”登录cat
;即local_debug_lk
总是为零;它永远不会启用。
另外,当我的驱动程序没有运行时,它运行正常!
连续两次“cat /proc/stat_my
”时,第一个值设置为1,然后再设置为0。
我的驱动程序是否可能没有选择local_debug_lk
变量的最新更新值?
你能告诉我这里我做错了什么吗?
答案 0 :(得分:1)
对.show
函数的更多调用可能比文件中的读数(使用cat /proc/show_stat
)。此外,基础系统需要来自.show
的稳定结果:如果使用相同参数调用,该函数应将相同信息打印到seq_file
。
正因为如此,切换 .show
函数中的一个标志 little sence ,并使函数的输出依赖在这个标志上只是错误。
通常,在文件 read 时更改任何内核状态不是用户期望的。最好使用 write 功能。
函数.show
实际上将信息打印到临时内核缓冲区中。如果一切正常,缓冲区中的信息将传输到用户缓冲区,最终由cat
打印。但是如果内核缓冲区太小,打印到其中的信息被丢弃。在这种情况下,底层系统会分配更大的缓冲区,并再次调用.show
。
此外,如果用户缓冲区太小而无法容纳所有打印的信息,则会重新运行.show
。