Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当printk()所在的内核函数没有被调用时(按ftrace),为什么printk()会在syslog内部连续打印?_C_Linux_Io_Linux Kernel - Fatal编程技术网

当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与进程关联起来。似乎系统日志每次写入时都在调用my
printk()
,导致输出流连续不断。但是,ftrace仍然没有显示调用
\u通用文件\u write\u iter()
的次数接近足够的次数,以反映调用my
printk()
的次数。因此,我的问题仍然是——如果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()列在可用的筛选函数中。