2013-05-07 12 views
7

Czy istnieje jakaś inna funkcjonalność w jądrze w postaci strerror? Nie byłem w stanie go znaleźć, więc moja myśl jest nie, ale co ważniejsze, czy była to jakaś dyskusja na ten temat? Myślę, że może to zredukować czas rozwiązywania problemów, ponieważ nie będziesz musiał wyszukiwać kodów błędów (które nie wszyscy zapamiętali) i prawdopodobnie ułatwią to administratorom systemu i normalnym użytkownikom (przez dmesg).funkcjonalność podobna do streroru w jądrze?

Chciałem zapytać tutaj przed wysłaniem LKML. Moje myśli dotyczyły podwójnego mechanizmu, jednego dla nazwy błędu (np. EINVAL), a drugiego dla opisu. Co więcej, rozszerzenie glibc %m może być dodane do printk, z tym wyjątkiem, że będzie musiało odczytać kod błędu, ponieważ rozszerzenie glibc czyta errno. Być może %m może wydrukować nazwę błędu, podczas gdy %M może wydrukować opis błędu?

W każdym razie, jeśli zostanie dodana, powinna to być opcja .config, ponieważ zwiększy rozmiar tekstu. Rozmiar można zmniejszyć, przechowując tylko nazwy błędów (od 1 do 133) w jednym ciągu z terminatorem zerowym między każdym ciągiem i po prostu wolnym strerror (wymuszonym na iteracji przez ciąg i zliczaniem terminali zerujących), ponieważ prędkość tego nie powinno mieć znaczenia. Błędy wewnętrzne 512-529 musiałyby występować w osobnym łańcuchu. Następnie można zwrócić bezpośredni wskaźnik do zakończonego znakiem null łańcucha, bez potrzeby kopiowania czegokolwiek. Według moich obliczeń, dla opisów błędów wymagałoby to około 1322 bajtów dla nazw błędów i 3540 bajtów (w oparciu o to, co teraz znajduje się w komentarzach po definicji # błędu i dodawanie "brak opisu" dla tych, których obecnie brakuje).

Następnie, po wyłączeniu konfiguracji, printk %m może być interpretowany jako %d, a %M może po prostu nic nie wydrukować (lub niektóre z nich).

+2

Wypróbuj 'man strace'. Jeśli jesteś zainteresowany faktycznym kodem błędu, masz alternatywne sposoby wyświetlania go z przestrzeni użytkownika. Czasem spodziewane są błędy, takie jak w 'stat', itp. Jądro jest w stanie dostarczyć bardziej szczegółowe informacje o błędach poza kontekstem' errno'. Z tych rzeczy składa się 'dmesg'. –

+0

@artless noise dzięki za komentarz i przepraszam za spóźnioną odpowiedź. Nie grałem z "strace" od dłuższego czasu i zapomniałem, jak użyteczne jest to, dzięki! W tym celu jednak głównie myślę o tym, kiedy wypiszesz kod błędu w printk. Myślę, że dodam coś do siebie i zaproponuję lkml, ale po zakończeniu mojego obecnego projektu. –

+0

hmm, zapomniałem o tym i napisałem tę poprawkę. Musiałem jednak użyć '% de', ponieważ użycie% m złamało ostrzeżenia printf gcc. :(Myślę, że powinienem iść dalej i przedłożyć to. Jedyne, czego obecnie brakuje, to to, że nie parsuje kilku rzeczy w jednym łuku (myślę, że pa-risc, teraz zapominam). –

Odpowiedz

3

Nie, nie ma. Ale możesz zobaczyć listę kodów błędów w include/asm-generic/errno.h i include/asm-generic/errno-base.h. Nie ma ich zbyt wielu (mniej niż 200), więc nie jest trudno nauczyć się ich w trakcie rozwoju.