/ / Używanie asercji w jądrze Linuksa - linux, linux-kernel, assert, asercje, asercja

Używanie asercji w jądrze Linuksa - linux, linux-kernel, assert, asercje, asercja

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 1

Odpowiednie 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)