在Linux中,如何从“struct file”结构中获取文件名,同时通过kgdb执行内核?

时间:2013-07-26 15:45:03

标签: linux-kernel

我正在尝试通过kgdb查看文件名,因此我无法调用函数和宏来以编程方式获取它。我需要通过手动检查数据结构来找到它。

如果我在gdb中有一个断点,我怎么能用gdb环顾四周找到文件名呢?

我尝试在filp.f_pathfilp.f_inode等处查看。我无法在任何地方看到文件名。

ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
     struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
     struct kiocb kiocb;
     ssize_t ret;

     init_sync_kiocb(&kiocb, filp);
     kiocb.ki_pos = *ppos;
     kiocb.ki_left = len;
     kiocb.ki_nbytes = len;

     ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
     if (-EIOCBQUEUED == ret)
             ret = wait_on_sync_kiocb(&kiocb);
     *ppos = kiocb.ki_pos;
     return ret;
}

3 个答案:

答案 0 :(得分:21)

您可以使用struct file *filpfilp->f_path.dentry->d_iname获取文件名。

获取完整路径调用dentry_path_raw(filp->f_path.dentry,buf,buflen)

答案 1 :(得分:2)

在Linux内核中,file结构本质上是内核“看到”文件的方式。内核对文件名不感兴趣,只对打开文件的inode感兴趣。这意味着丢失了对用户重要的所有其他信息。


编辑:这个答案错了​​。您可以使用dentry获取filp->f_path.dentry。从那里,您可以使用相关的FS标记获取dentry的名称或完整路径。

答案 2 :(得分:0)

路径存储在file-> f_path结构中,顾名思义。只是不是以平面文本形式,而是解析为对内核操作更有用的对象,即一系列dentry结构,以及指向当前子树根的vfsmount结构。

您可以使用d_path函数为结构路径(如file-> f_path)重新生成人类可读的路径名。请注意,这不是一个便宜的操作,它可能会显着减慢您的工作量。

上面提到的有关打开但未链接的文件,多个硬链接和类似文件的问题对于映射from和inode到路径名是有效的,而open文件总是有一个与之关联的路径。如果文件已被取消链接,则d_path将在名称前加上“(已删除)”,如果已打开的文件名已使用重命名更改为其他名称,因为它已打开,d_path将不会打印原始名称,但是用于打开它的条目的当前名称。