Linux kernel 在Linux中,如何从;“结构文件”;结构,同时使用kgdb单步执行内核?

Linux kernel 在Linux中,如何从;“结构文件”;结构,同时使用kgdb单步执行内核?,linux-kernel,Linux Kernel,我试图通过kgdb查看文件名,因此无法调用函数和宏以编程方式获取文件名。我需要通过手动检查数据结构来找到它 就像我在gdb中有一个断点一样,我如何使用gdb查找文件名 我试着在filp.f_路径,filp.f_inode中四处查看。我在任何地方都看不到文件名 ssize\u t do\u sync\u write(结构文件*filp,常量字符*user*buf,大小长度,loff\u t*ppos) { 结构iovec iov={.iov_base=(void u user*)buf、.iov_

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

就像我在gdb中有一个断点一样,我如何使用gdb查找文件名

我试着在
filp.f_路径
filp.f_inode
中四处查看。我在任何地方都看不到文件名

ssize\u t do\u sync\u write(结构文件*filp,常量字符*user*buf,大小长度,loff\u t*ppos)
{
结构iovec iov={.iov_base=(void u user*)buf、.iov_len=len};
结构kiocb kiocb;
ssize_t ret;
初始化同步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);
如果(-EIOCBQUEUED==ret)
ret=等待同步kiocb(&kiocb);
*ppos=kiocb.ki_pos;
返回ret;
}

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



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

该路径存储在file->f_path结构中,正如其名称所示。只是不是纯文本形式,而是解析为对内核操作更有用的对象,即
dentry
结构链和指向当前子树根的
vfsmount
结构

您可以使用
d\u path
函数为结构路径(如file->f\u path)重新生成人类可读的路径名。但是请注意,这不是一个便宜的操作,它可能会显著降低您的工作负载


上面提到的关于打开但未链接的文件、多个硬链接和类似的问题对于从和索引节点映射到路径名是有效的,并且打开的文件始终具有与其关联的路径。如果文件已取消链接
d_path
将在名称前加一个“(已删除)”,并且如果打开文件时使用的文件名自打开以来已使用重命名更改为其他文件名,d_path将不会打印原始名称,但是用于打开它的条目的当前名称。

您可以通过
filp->f_path.dentry->d_iname
struct file*filp
获取文件名


要获得完整的路径调用
dentry\u path\u raw(filp->f\u path.dentry,buf,buflen)

好的,Stephan,我知道这是一个单独的问题,但我几个月来一直试图找出如何控制代码语法突出显示或至少代码识别,但一直没有找到答案。您是如何修复它以识别我的c代码的起始位置的?当打开一个文件时,文件系统从目录条目中查找inode,然后忘记除inode之外的所有内容;没有直接联系。由于诸如硬链接、
取消链接
O_TMPFILE
等机制,一个
结构文件
可以有零个或多个文件名。我猜类似于“无法完成”这样的答案仍然是一个答案。不,信息在这里,在内核中:$readlink/proc/6456/fd/33/usr/share/qt4/doc/qch/assistant.qch
s/plane text/plain text/
除非你为波音或空客工作:)这里要小心-d_iname只用于“短”名称。对于生产代码,请使用path.dentry->d_name.name