我正在尝试通过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;
}
答案 0 :(得分:21)
您可以使用struct file *filp
从filp->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将不会打印原始名称,但是用于打开它的条目的当前名称。