2013-07-26 28 views
6

我想通過kgdb查看文件名,所以我無法調用函數和宏來以編程方式獲取它。我需要通過手動檢查數據結構來找到它。在Linux中,如何從「struct file」結構中獲取文件名,同時用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; 
} 
+0

OK斯蒂芬,我知道這是一個單獨的問題,但我一直在試圖找出如何控制代碼語法高亮或者至少碼識別了幾個月,並沒有找到答案。你是如何解決它以識別我的C代碼在哪裏開始的? –

+0

[Markdown編輯幫助](http://stackoverflow.com/editing-help) –

+0

打開文件時,文件系統從目錄項中查找inode,然後忘記inode以外的所有內容;沒有直接的聯繫。由於像硬鏈接,'unlink'和'O_TMPFILE'這樣的機制,'struct file'可以有零個或多個文件名。 –

回答

1

在Linux內核中,file結構本質上就是內核如何「看到」文件。內核對文件名稱不感興趣,只是打開文件的inode。這意味着對用戶來說重要的所有其他信息都會丟失。


編輯:這個答案是錯誤的。您可以使用filp->f_path.dentry獲得dentry。從那裏你可以使用相關的FS標誌獲得dentry的名稱或完整路徑。

+0

我猜想一個答案就像「它不能做到」,儘管如此,答案仍然是。 Thx –

+1

不,信息在這裏,在內核中: $ readlink/proc/6456/fd/33 /usr/share/qt4/doc/qch/assistant.qch – asashnov

18

你可以從struct file *filp文件名以filp->f_path.dentry->d_iname

要獲得完整的路徑調用dentry_path_raw(filp->f_path.dentry,buf,buflen)

相關問題