当printk()所在的内核函数没有被调用时(按ftrace),为什么printk()会在syslog内部连续打印?
我正试图从内部打印当printk()所在的内核函数没有被调用时(按ftrace),为什么printk()会在syslog内部连续打印?,c,linux,io,linux-kernel,C,Linux,Io,Linux Kernel,我正试图从内部打印\uu generic\u file\u write\u iter()中的一些信息 我对函数进行了如下修改: struct file *file = iocb->ki_filp; struct address_space * mapping = file->f_mapping; struct inode *inode = mapping->host; ssize_t written = 0; ssize_t err; ss
\uu generic\u file\u write\u iter()
中的一些信息
我对函数进行了如下修改:
struct file *file = iocb->ki_filp;
struct address_space * mapping = file->f_mapping;
struct inode *inode = mapping->host;
ssize_t written = 0;
ssize_t err;
ssize_t status;
/* We can write back this queue in page reclaim */
current->backing_dev_info = inode_to_bdi(inode);
err = file_remove_privs(file);
if (err)
goto out;
err = file_update_time(file);
if (err)
goto out;
/* This if() is all I have added */
if(io_tracing_on) {
ssize_t write_size = iov_length(from->iov, from->nr_segs);
printk(KERN_INFO "write size=%zu, pid=%d, inode=%lu\n", write_size, task_pid_nr(current), inode->i_ino);
}
if (iocb->ki_flags & IOCB_DIRECT) {
loff_t pos, endbyte;
...
io_tracing_on是我通过/proc条目设置的变量(由内置于内核中的模块创建)。当我打开开关并运行dd(通过dd if=/dev/uradom of=/tmp/gibberish bs=1M count=1
)时,我会得到一个到/var/log/syslog
的连续输出流,即:
Jun 27 15:00:41 malka kernel: [ 463.424155] write size=168, pid=715, inode=7864653
Jun 27 15:00:41 malka kernel: [ 463.428064] write size=168, pid=715, inode=7864354
Jun 27 15:00:41 malka kernel: [ 463.428126] write size=168, pid=715, inode=7864653
Jun 27 15:00:41 malka kernel: [ 463.432061] write size=168, pid=715, inode=7864354
Jun 27 15:00:41 malka kernel: [ 463.432121] write size=168, pid=715, inode=7864653
Jun 27 15:00:41 malka kernel: [ 463.436075] write size=168, pid=715, inode=7864354
Jun 27 15:00:41 malka kernel: [ 463.436133] write size=168, pid=715, inode=7864653
Jun 27 15:00:41 malka kernel: [ 463.440060] write size=168, pid=715, inode=7864354
Jun 27 15:00:41 malka kernel: [ 463.440121] write size=168, pid=715, inode=7864653
etc
然而,当我运行ftrace(使用“函数”跟踪程序)时,我从未看到调用\u generic\u file\u write\u iter()。那么,为什么我的printk()
内核版本是4.5.5
更新
以前,我无法将pid与任何有效的进程相关联。在将代码更改为打印pid和tgid之后,我能够将tgid与进程关联起来。似乎系统日志每次写入时都在调用myprintk()
,导致输出流连续不断。但是,ftrace仍然没有显示调用\u通用文件\u write\u iter()
的次数接近足够的次数,以反映调用myprintk()
的次数。因此,我的问题仍然是——如果ftrace按照我的预期工作,我会想象,对于我在系统日志中看到的每个printk()
,ftrace中都会有一个对\u generic\u file\u write\u iter()
的调用
然而,当我运行ftrace(使用“函数”跟踪程序)时,我从未看到
\u通用文件\u写入iter()
调用
最有可能的是,\u通用文件\u写入\u iter
未列在/sys/kernel/debug/tracing/available\u filter\u functions
中(ftrace可以跟踪的函数,请参阅或)
然而,当我运行ftrace(使用“函数”跟踪程序)时,我从未看到
\u通用文件\u写入iter()
调用
最有可能的是,\uuu generic\u file\u write\u iter
未在/sys/kernel/debug/tracing/available\u filter\u functions
中列出(那些ftrace可以跟踪、查看或删除的函数)。您能解释一下“未被调用”是什么意思吗?你的意思是它没有被你的dd进程调用,或者根本没有被调用?“当它所在的内核函数没有被调用时。”在文章中,我说“我从来没有看到过被调用的\uuuu generic\u file\u write\u iter()。“没有被调用”指的是没有被调用的\uuuu generic\u file\u write\u iter(),如ftrace所示。出于好奇,当你阅读整篇文章时,这是不是不清楚?或者你只是没有阅读整篇文章?我会考虑如何使它不那么模棱两可,你对这个问题的回答会帮助我解决这个问题。你能解释一下你所说的“没有被叫”是什么意思吗?你的意思是它没有被你的dd进程调用,或者根本没有被调用?“当它所在的内核函数没有被调用时。”在文章中,我说“我从来没有看到过被调用的\uuuu generic\u file\u write\u iter()。“没有被调用”指的是没有被调用的\uuuu generic\u file\u write\u iter(),如ftrace所示。出于好奇,当你阅读整篇文章时,这是不是不清楚?或者你只是没有阅读整篇文章?我将考虑如何使其不那么模棱两可,您对这个问题的回答将帮助我解决这个问题。uuu generic_file_write_iter()列在可用的筛选函数中。uu generic_file_write_iter()列在可用的筛选函数中。