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

Joe*_*e C 6 linux-kernel

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

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

我试图寻找周围filp.f_path,filp.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;
}
Run Code Online (Sandbox Code Playgroud)

PLA*_*PLA 23

你可以从文件名struct file *filpfilp->f_path.dentry->d_iname.

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


cyp*_*har 5

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


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

  • 不,信息在这里,在内核中: $ readlink /proc/6456/fd/33 /usr/share/qt4/doc/qch/assistant.qch (2认同)