2013-07-26 8 views
6

Próbuję wyświetlić nazwę pliku poprzez kgdb, więc nie mogę wywoływać funkcji i makr, aby uzyskać programowo. Muszę go znaleźć ręcznie, sprawdzając struktury danych.W systemie Linux, jak mogę uzyskać nazwę pliku od struktury "struct file", podczas przechodzenia przez jądro z kgdb?

Jakbym miał punkt przerwania tutaj w gdb, jak mógłbym rozejrzeć się z gdb i znaleźć nazwę pliku?

Próbowałem rozglądać się w filp.f_path, filp.f_inode itp. Nie widzę nazwy pliku w dowolnym miejscu.

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 Stephan, wiem, że to jest osobne pytanie, ale próbowałem dowiedzieć się, jak kontrolować podświetlanie składni kodu lub co najmniej rozpoznawanie kodu przez miesiące i nie znalazłem odpowiedzi. Jak to naprawiłeś, żeby rozpoznać, gdzie zaczął się mój kod c? –

+0

[Pomoc do edycji znaczków] (http://stackoverflow.com/editing-help) –

+0

Po otwarciu pliku system plików wyszukuje i-węzeł z pozycji katalogu, a następnie zapomina o wszystkim oprócz i-węzła; nie ma bezpośredniego połączenia. Z powodu mechanizmów takich jak twarde łącza, 'unlink' i' O_TMPFILE', może istnieć zero lub wiele nazw plików dla 'struct file'. –

Odpowiedz

1

w jądrze Linux, struktura file jest zasadniczo jak jądro „widzi” plik. Jądro nie jest zainteresowane nazwą pliku, tylko i-węzłem otwartego pliku. Oznacza to utratę wszystkich innych ważnych dla użytkownika informacji.


EDYCJA: Ta odpowiedź jest błędna. Możesz uzyskać dentry używając filp->f_path.dentry. Stamtąd można uzyskać nazwę dentry lub pełną ścieżkę za pomocą odpowiednich flag FS.

+0

Sądzę, że odpowiedź typu "nie da się zrobić" jest jednak odpowiedzią. Thx –

+1

Nie, informacja jest tutaj, w jądrze: $ readlink/proc/6456/fd/33 /usr/share/qt4/doc/qch/assistant.qch – asashnov

0

Ścieżka jest przechowywana w strukturze file-> f_path, jak wskazuje nazwa. Po prostu nie w formie płaskiego tekstu, lecz spakowane w obiekty, które są bardziej użyteczne dla operacji jądra, a mianowicie łańcuch struktur zębatych i struktura vfsmount wskazująca na rdzeń bieżącego poddrzewa.

Możesz użyć funkcji d_path, aby zregenerować nazwę ścieżki czytelnej dla człowieka dla ścieżki struct, takiej jak file-> f_path. Należy jednak pamiętać, że nie jest to tania operacja i może znacznie spowolnić pracę.

Wyżej wymienione problemy dotyczące otwartych, ale niepowiązanych plików, wielu twardych linków i podobnych są ważne dla odwzorowania od i i-węzła do nazwy ścieżki, a otwarty plik zawsze ma przypisaną do niego ścieżkę. Jeśli plik został odłączony, d_path spowoduje dodanie do nazwy "(usunięty)", a jeśli nazwa pliku, dla której została ona otwarta, została zmieniona na coś innego przy użyciu zmiany nazwy, ponieważ została otwarta, d_path nie wydrukuje oryginalnej nazwy, ale obecna nazwa pozycji, która została użyta do otwarcia.

+0

's/samolot text/plain text /' chyba pracujesz dla Boeinga lub Airbusa :) – Eric

18

Możesz uzyskać nazwę pliku od struct file *filp z filp->f_path.dentry->d_iname.

Aby uzyskać pełną ścieżkę, należy zadzwonić pod numer dentry_path_raw(filp->f_path.dentry,buf,buflen).

Powiązane problemy