Mam pytanie assert()
w Linuksie: czy mogę go używać w jądrze?
Jeśli nie, jakich technik zwykle używasz, jeśli na przykład nie chcę wprowadzać wskaźnika NULL?
Odpowiedzi:
40 za odpowiedź nr 1Odpowiednie makra jądra są BUG_ON
i WARN_ON
. Pierwsza z nich dotyczy sytuacji, w której chcesz wywołać panikę w jądrze i sprowadzić system (np. Błąd niemożliwy do odzyskania). Ta ostatnia służy do rejestrowania czegoś w dzienniku jądra (widocznym przez dmesg
).
Jak mówi @Michael, w jądrze musisz zweryfikować wszystko, co pochodzi z przestrzeni użytkownika i po prostu zajmij się tym, cokolwiek to jest. BUG_ON i WARN_ON mają wychwytywać błędy we własnym kodzie lub problemy ze sprzętem.
7 dla odpowiedzi nr 2
Jedną z opcji byłoby użycie makra BUG_ON()
. To będzie printk
wiadomość, a potem panic()
(tj. zawieszenie) jądra.
http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel
Oczywiście powinno to być stosowane tylko jako strategia obsługi błędów ostatniej instancji (tak jak assert
) ...
5 dla odpowiedzi nr 3
Nie. Jeśli nie pracujesz nad rdzeniem jądra, a raczej nad modułem, powinieneś zrobić wszystko, co w jego mocy, aby nigdy nie ulec awarii (technicznie, abort()
) jądro. Jeśli nie chcesz używać wskaźnika NULL, po prostu nie rób tego. Sprawdź go przed użyciem i utwórz dziennik błędów, jeśli jest.
Najbliższa rzecz moc chcesz zrobić, jeśli rzeczywiście obchodzisz się z przypadkiem śmiertelnym panic()
funkcja lub BUG_ON
i WARN_ON
makra, które przerywają wykonywanie i generują komunikaty diagnostyczne, ślad stosu i listę modułów.
4 dla odpowiedzi № 4
Cóż, wyłuskiwanie zerowego wskaźnika spowoduje powstanie oops, który można wykorzystać do znalezienia kodu, który narusza. Teraz, jeśli chcesz potwierdzić () dany warunek, możesz użyć
BUG_ON(condition)
Mniej śmiercionośnym mechanizmem jest WARN_ON, który wywoła śledzenie bez awarii jądra.
0 dla odpowiedzi № 5
BUG_ON()
jest właściwym podejściem do tego. Sprawdza, czy warunek jest prawdziwy i wywołuje makro BUG()
.
W jaki sposób BUG()
radzi sobie z resztą, co zostało bardzo dobrze wyjaśnione w następującym artykule:
http://kernelnewbies.org/FAQ/BUG
0 dla odpowiedzi № 6
Używam tego makra, używa BUG (), ale dodaje trochę więcej informacji, których normalnie używam do debugowania i oczywiście możesz go edytować, aby dodać więcej informacji, jeśli chcesz:
#define ASSERT(x)
do { if (x) break;
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %sn",
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG();
} while (0)