9

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;
}
4

4 に答える 4

1

その名前が示すように、パスは file->f_path 構造に格納されます。プレーンテキスト形式ではなく、カーネル操作により便利なオブジェクト、つまりdentry構造のチェーン、およびvfsmount現在のサブツリーのルートを指す構造に解析されます。

この関数を使用して、d_pathfile->f_path のような構造体パスの人間が読めるパス名を再生成できます。ただし、これは安価な操作ではなく、ワークロードが大幅に遅くなる可能性があることに注意してください。

開いているがリンクされていないファイル、複数のハードリンクなどに関する上記の問題は、inode からパス名へのマッピングに有効であり、開いているファイルには常にパスが関連付けられています。ファイルがリンク解除されているd_path場合、名前の前に " (deleted)" が追加され、開かれたファイル名が名前変更を使用して別のものに変更された場合、d_path は元の名前を出力しませんが、現在の名前を出力します。それを開くために使用されたエントリの名前。

于 2013-08-08T08:39:08.137 に答える